--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CHANGELOG.md HEAD (b89dc9e6) Text, 151.85 KB
Changelog
All notable changes to this project will be documented in this file.
[4.8.2] - 2026-07-27
Added
• Public demo mode: Read-only mesh showcase via T383838MESHCHAT_DEMO_MODE or T383838--demo (blocked sends and API mutations, in-app demo banner). Optional ALTCHA v3 on login/setup, T383838MESHCHAT_AUTH_PAGE_HINT for login page text, and docker-compose.demo.yml for Coolify.
• Database upgrades: Automatic backup-pre-migrate-*.zip before schema migrations (skip with T383838MESHCHAT_SKIP_PRE_MIGRATE_BACKUP=1). CLI T383838--list-backups and T383838--export-backup to list or copy backups for rollback. Post-migrate quick_check, structured migration logs, pre-migrate zip retention (five by default), storage lock for single-writer volumes, and N-1/N-2 fixture upgrade tests.
Fixed
• Messages (personal notes): Sending to your own LXMF address or identity is stored locally as delivered (method local) without LXMF router outbound, so self-chat no longer hangs in a waiting state.
• Messages sidebar: Conversation list updates optimistically when you press Send, before the server acknowledges the message.
• E2E: Playwright API helpers attach CSRF tokens for direct backend POSTs; T383838pretest:e2e installs Chromium before the suite runs.
• Android LXST / Codec2: When the Chaquopy pycodec2.so extension is an empty stub, fall back to a ctypes Codec2 binding over the bundled libcodec2.so so LXST Codec2 voice profiles work on device. Still preload jniLibs Codec2 and reload soft-imported LXST bindings after probe.
• Android RNode flasher: Open native flasher returns a real status, keeps USB-serial classes through R8, uses an ActionBar theme, and surfaces startup failures instead of silently doing nothing. Bluetooth Open settings tries GrapheneOS-friendly fallbacks (app details, Bluetooth settings, general Settings) instead of toasting unavailable.
• Connection banners: Do not flash disconnected on startup before the first successful WebSocket open. Debounce disconnect UI for 2.5s and only show reconnected when the disconnect banner was actually shown. Foreground recovery prefers a ping for longer before forcing a reconnect.
• Android calls: Clarify that the web audio bridge on Android uses native mic and speaker through the telephone audio bridge, not browser getUserMedia.
• Browser calls (Docker / HTTPS): Refresh Devices prompts with bare getUserMedia({ audio: true }) first so Brave and Chromium show the microphone dialog. Constrained requests (echoCancellation and friends) often return NotFoundError before permission is granted and never ask. Clearer toasts for insecure HTTP and pending/denied mic permission.
• HTTP security headers: Send Permissions-Policy allowing microphone, camera, bluetooth, serial, and usb for this origin so reverse proxies that omit the header do not block capture or RNode flasher hardware APIs by default.
• RNode flasher Bluetooth: Detect Brave's disabled-by-default Web Bluetooth API, show how to enable T383838brave://flags/#brave-web-bluetooth-api, and offer Try Bluetooth / Recheck actions. Web Bluetooth has no mic-style prompt. The device chooser from requestDevice() is the permission UI.
• UI language: Persist language changes over the config HTTP API (not WebSocket-only), normalize legacy locale codes, and stop the Reticulum manual language picker from overwriting app UI language.
• Network visualizer: WebGL background follows light theme and clears while the WASM scene is still loading. Boot theme removes stale dark class when light is selected.
• Translator (Landlock): On Linux, allow read/execute for user-local pipx CLIs (T383838~/.local/bin, T383838~/.local/share/pipx) and read-write for Argos Translate data under T383838~/.local/share/argos-translate, so argospm language lists and local Argos translation work with the filesystem sandbox enabled.
• Tests: Landlock integration probes for subprocess spawn, translator Argos language listing, user-local CLI execution, and home write denial outside RW roots (tests/backend/testlandlockintegration_surfaces.py).
• Windows desktop: AppContainer sandboxing is opt-in (set T383838MESHCHAT_APPCONTAINER=1) instead of on by default, to avoid extra launcher processes and heavy startup until the path is stable.
[4.8.1] - 2026-07-25
Fixed
• Windows desktop: Frozen backends start again instead of failing when aiohttp imports the standard library email package.
• Desktop packaging: Only the correct LXST filterlib binary ships per platform so integrity checks match the installer. CI runs a frozen import smoke test before release.
[4.8.0] - 2026-07-25
Added
• Browser PWA shell caching for UI assets, with a network-first fallback during short backend restarts (not used in Electron)
• Plugin system: ZIP and WASM install, signed packages (RSG), Python and Sideband backends, install consent, and Settings management
• Bundled Bug Reports plugin, plus plugin translations, UI slots, and contribution registries
• Map overlays from NomadNet and RNGit (KMZ, KML, GeoJSON) with cache and refresh
• RNS Link WebSocket API for external apps and plugins
• RNS File Sync for shared folders on the mesh, with an in-app file manager to browse, upload, download, and delete files
• Settings: Reticulum instance and share controls, tabbed Settings navigation, and desktop close or tray behavior
• Nomad favourites: per-identity section layout
• Optional pip-rns and rngit install path for RNS packages and docs
• Message export and import with contacts and read state
• Message maintenance in Settings: purge old local messages and clear duplicates
• Host battery status on About and in the header (Electron, Android, Chromium)
• System resource monitoring for CPU and memory in the UI
• RSM signing and verification for meshchatx.rsm
• Notification sound settings
• LXMFy 2.0.1 with RRC hub client support for bots
• Network visualiser WebGL and WASM renderer, with a vis-network fallback and a Settings preference
• Interfaces: internal mode, recursive path requests, announces-from-internal, discovery location command, and Backbone fast-flapping options
• Reticulum interface module management from the UI
• Reticulum 1.4.1 and LXMF 1.1.0, including propagation node options and cancel for incoming large message downloads
• Interfaces: path gravity, announces-to-internal, and discovery autoconnect gravity and mode options
• Relay Chat room keys so hosts can require a key to join a room
• Desktop privacy: Windows screen security to omit MeshChatX from screenshots, recording, and Recall
• Android privacy options to block screenshots and clear the clipboard when backgrounded
• About shows the git commit. Nightly, preview, and local builds also show a short channel label in the sidebar
• Tutorial connect: Internet plus local (recommended) adds AutoInterface and pre-selects three random community TCP bootstraps
• Remote management allow-list for identities that may query this instance with rnstatus and rnpath
• Post-install prompts for existing users after upgrades
• Coolify-oriented Docker Compose with resource limits for deployments
• LXST telephony half-duplex mode, live duplex switching, push-to-talk, and richer in-call stats
• Optional Linux seccomp-BPF syscall denylist alongside Landlock
• Bundled RNS-over-HTTP HTTPInterface with Interfaces page client and server setup, auto-install into the Reticulum interface path, and httpx support on Android
• Docker extra image variant with i2pd and yggdrasil, published beside the standard and hardened images
Changed
• Tutorial: language and theme controls no longer overlay bootstrap titles. Connection and bootstrap actions stay locked while discovery or random pick is running
• Tutorial connect and bootstrap: recommended mode stays on the bootstrap step for next and back, Finish is only on the last step, and random pick no longer sticks busy without a selection
• Tutorial privacy and security step: shorter mobile copy and toggle layout so labels and switches fit
• Auto propagation finder: requires usable paths and a scarce LXMF sync probe, remembers verified peers per identity, prefers live announces, cools down failures, and avoids re-probing a working preferred peer
• Community interface presets refreshed from directory.rns.recipes (69 online listings)
• Bundled Reticulum manual updated
• Discovery map markers use dual-halo badge icons with banded cluster badges, zoom-gated labels, and cached styles for denser maps
• Map default basemap is OpenStreetMap. Style presets list OSM first, and identity config wins over stale cached tile URLs
• UI opens sooner: HTTP binds first, Reticulum starts in the background
• Conversations load faster with slim list and thread queries
• Conversation list uses a per-peer summary so refreshes no longer scan full message history
• Conversation list omits contact image blobs and limits heavy callers such as Map and Network Visualiser
• Messages page conversation poll is slower and skips while the tab is hidden
• Fresh database init stays fast by skipping empty message-flag backfill
• Outbound message status icons and titles reflect delivery method and state more clearly
• Relay Chat: denser hub UI, announce interval, collapsed system lines, and reconnect notices
• Relay Chat: clickable Nomad and LXMF links plus basic markdown for code, bold, italic, and strikethrough
• Low-memory cleanup and SQLite tuning under memory pressure
• Auto-resend keeps attachments and cleans duplicate outbound rows more reliably
• Calls and audio work in Docker and headless setups via hostless LXST backends and the web audio bridge
• Hardened identity path handling, stamp enforcement, plugin integrity, Nomad downloads, and local file path jails
• Plugin strings live in plugin bundles, not main locale files
• Docker frontend build includes the visualiser WASM and fails if those artifacts are missing
Fixed
• LXMF outbound progress polling stops on REJECTED as well as delivered, failed, and cancelled states
• Android Codec2: preload native libcodec2 before Python codec imports
• Android RNode flasher is a native Activity with USB serial and ESP32 ROM flash. Tools opens it instead of a WebView serial polyfill
• Android RNode flasher: Bluetooth permission request returns real status, handles the result callback, and opens app settings when permanently denied
• Web Sync Messages after a backgrounded browser tab recovers a stale WebSocket, refreshes CSRF, and does not abort sync when path priming fails
• Conversations: re-opening an already-read thread no longer decrements the Messages unread badge
• Notifications: Do Not Disturb still updates the Messages unread badge. It only suppresses OS notifications and sound
• Identity switch clears Relay Chat, NomadNet browser tabs, Map tabs, and RNSh session UI so keep-alive pages cannot show the previous identity
• Map local URL checks use the private 172.16.0.0/12 range instead of treating all 172.x hosts as local
• Messages unread badge is no longer overwritten by a paginated or filtered conversation page count
• Deep-link or compose open marks the conversation read so the sidebar unread state clears
• Map my-location prefers LXMF address hash telemetry, not only identity hash
• RNode flasher integrity lookup matches flat and nested keys so required scripts load
• Relay Chat kick, ban, and failed auto-rejoin clear unread counts so room pills do not stick
• Nomad archive load owns its download id so mismatched replies cannot leave the spinner stuck
• Relay Chat invite-only rooms grant a reconnect invite on unexpected link drop so auto-rejoin still works after the one-shot invite was consumed
• Map remote overlay loads no longer undo layers from a stale generation, and tile cache view keys are identity-scoped
• Nomad micron LXMF links route to Messages instead of being ignored
• RNSh session config and identity paths stay under storage or the shared Reticulum config dir. Free-form extra args are rejected
• Failed identity switch no longer wipes keep-alive UI and clears the switching overlay correctly
• Settings, About, and Interfaces refresh identity-scoped state after an identity switch
• About snapshot and backup restore guards concurrent restores and reloads the web UI after a successful restore
• Interfaces enable and disable write the enabled flag when neither legacy key exists, and disable returns the correct success message
• Interfaces enable and disable roll back in-memory config when the Reticulum config write fails
• Disabling block-all-from-strangers restores a prior inbound stamp cost of 0 instead of forcing 8
• Discovery settings save returns an error when RNS reload fails after a successful disk write
• Interfaces stats map is replaced each poll so deleted interfaces cannot stay Connected
• Desktop AppImage: logs always append to the storage logs folder. Stdout is only used when a terminal is attached, so background launches no longer raise broken-pipe dialogs
• Android: LXMFy packaging, flock soft-lock, splash and logo clipping, Landlock skipped on Android
• Android RNode BLE and USB via Chaquopy
• Startup checks and disables unsupported interfaces
• Nomad favourites: no more Unknown Node or lost custom sections
• Relay Chat message dedupe. Network visualiser faster on large meshes
• Bots and RNSh work in frozen macOS and Windows builds
• Sensitive config is no longer mutable over WebSocket. Reticulum config repair on startup
• Paper message URI encoding for non-ASCII title and content
• LXMA contact import works with current RNS public-key loading and remembers the peer key before announce
• Android calls: overlay accept opens the phone tab so native audio attaches. Web audio is no longer permanently disabled after a bridge error
• Android Codec2: reliable native preload, builds fail without Codec2 wheels or jniLibs, and unavailable Codec2 profiles are hidden
• Unknown meshchatx links return a clear error instead of falling through to LXMF
• NomadNet Micron copy no longer inserts a newline between every character
• Unread message count is a red pill on the Messages nav icon
• Missed call count is a red pill on the Calls nav icon
• Notification bell removed from the header
• Unread badge stays circular and remains visible when the sidebar is collapsed
• Open conversations mark as read when a new message arrives without needing to reselect the thread
• Unread badges dismiss when navigating back to an already-open Messages or Relay Chat room
• Startup stage logs no longer print the same stage twice
• Ctrl+C shutdown no longer floods reentrant logging errors
• RNStatus interface mode labels match Reticulum modes again, including Internal
[4.7.2] - 2026-07-06
Fixed
• Electron: A T383838will-navigate guard sends external http(s) URLs to the OS browser instead of replacing the MeshChatX window when a link is followed in-place (complements the 4.7.1 T383838window.open handling).
• Micron editor / mesh servers: Publishing preserves T383838.html, T383838.md, and T383838.txt tab extensions instead of always saving as T383838.mu.
• Page node API: Publish failures return clear error messages for invalid JSON bodies, disk write errors, and mesh handler registration failures instead of unhandled 500 responses. File uploads use the same error handling. Fixes #25.
• Archives / RNCP / messages: Rich HTML link clicks use a shared navigation policy so http(s) links open externally and mesh links stay in-app (same behavior as Nomad Network and the micron editor preview).
• Android: External http(s) links open in the system browser instead of being silently blocked in the WebView.
• RNSh: Session startup prefers T383838python -m RNS.Utilities.rnsh.rnsh over the pip T383838rnsh console-script wrapper so sessions work when the wrapper is not executable (common with T383838pip install --user) or when Landlock denies executing paths outside allowed read roots (e.g. T383838~/.local/bin/rnsh). Fixes #36.
• Interfaces: The Interfaces page no longer shows all links as Down when Reticulum is running normally. T383838/api/v1/interface-stats now serializes all byte fields (T383838network_id, interface hashes, IFAC signatures, and related values) instead of failing on unconverted payloads. Stats are merged on the frontend by T383838interface_name as well as T383838short_name. Fixes false Down status when MeshChatX owns its own Reticulum instance (embedded mode). Attaching to an already-running T383838rnsd shared instance was unaffected.
• Messages / stranger banner: The Add to Contacts button on the stranger-protection banner now uses the CSRF-aware T383838window.api client instead of raw T383838fetch, so adding a contact from the banner works again. It also checks for an existing contact before creating a duplicate, and shows a success or error toast for the result. Fixes #38.
• Android / QR scanning: Contact, message, and paper-message scanners now use a shared camera helper with higher-resolution constraints, optional continuous autofocus, and a jsQR canvas fallback when the WebView T383838BarcodeDetector API is missing or unreliable. Camera permission is requested at Android startup. Fixes #41.
• macOS: Universal DMG startup no longer fails with T383838ImportError: cannot import name '_add_newdoc_ufunc' from 'numpy._core._multiarray_umath' or T383838incompatible architecture (have 'arm64', need 'x86_64') on NumPy. The x64 cx_Freeze slice now installs locked dependencies via T383838uv sync --python-platform x86_64-apple-darwin (matching the arm64 slice) instead of unpinned T383838pip install -e ., and the universal merge step refuses to mix mismatched pure-Python files with native extensions under the same package.
• UI / sidebars: Collapsed state for the main navigation sidebar and feature sidebars (Messages, Nomad Network, Relay Chat) now persists in localStorage when switching pages or returning later.
• Desktop / crash recovery: The Electron crash screen now diagnoses database corruption, lists local automatic backups, can restore a backup offline, relaunch with auto-repair or emergency mode, and includes copyable instructions for completely removing MeshChatX and Reticulum data folders.
• Database backups: Creating a manual backup no longer bundles the just-created backup T383838.zip into its own archive when the file is written inside the identity storage directory.
• Notifications: The notification bell now refreshes immediately when a conversation is marked as read from the conversation view or via bulk mark-as-read in Messages, instead of waiting on the next 5-second poll or the next dropdown open.
• Bots: Error and process log text in the Bots tool no longer picks up a stray line break from the closing T383838<pre> tag formatting.
Added
• Messages / images: Conversation images show a hover download control and support right-click Save image to device in the full-screen preview, in addition to the existing message context menu action.
• Docs: README troubleshooting section for database corruption, backup restore, and full data removal on Linux, macOS, and Windows.
• Rich HTML links: Shared T383838NomadRichHtmlLinks click handler for v-html surfaces (Nomad browser, micron editor preview, archives, RNCP, conversation messages). Routes Nomad mesh and LXMF links in-app, opens http(s) externally, scrolls in-page anchors, and blocks unsafe T383838javascript: navigation. Behavior contract tests guard wiring across frontend, Electron, and Android.
• Location / telemetry: Settings include a Disabled location source so outbound telemetry replies are not sent until the operator opts in. New installs default to Disabled instead of browser geolocation.
• Docs: T383838scripts/sync-meshchatx-docs.js copies T383838docs/*.md into the in-app T383838meshchatx-docs bundle on T383838predev and T383838prebuild-frontend. Adds the Meta Quest (SideQuest) installation guide.
• Android: Vendored a patched bleak pure-python wheel (unsupported platform-specific backend requirements stripped from its metadata) so RNode interfaces can use Bluetooth LE on Android builds.
Changed
• Docs: README clarifies that Linux AppImage and T383838.deb packages require glibc (not Alpine/PostmarketOS/musl) and documents T383838APPIMAGE_EXTRACT_AND_RUN for FUSE-less launches. Fixes #40.
• Tests: Removed obsolete no-op backend tests. Strengthened frontend security and UI coverage (BlockedPage, SettingsPage copy/banished visibility, TGS decode fuzz, RelayChat XSS fuzz, interfaceDiscoveryUtils, ArchivesPage, NomadRichHtmlLinks) with behavior assertions instead of always-true checks. Added T383838test_interface_stats_endpoint for T383838/api/v1/interface-stats JSON serialization, plus an API client usage guard test that fails if a mutating request bypasses the CSRF-aware T383838window.api client. New T383838task test:quick / T383838test:quick:be / T383838test:quick:fe commands run a fast backend and frontend regression subset, and CI runs a thin Playwright smoke suite (T383838tests/e2e/smoke.spec.js) against the backend and Vite dev server.
• Packaging: Arch T383838PKGBUILD installs Python dependencies with T383838uv sync instead of a bare T383838uv pip install step.
• CI: GitHub Actions workflows were reorganized around shared composite actions (T383838fetch-frontend-artifact, T383838setup-dev-environment, T383838setup-python-uv), the CodeQL workflow was renamed to T383838security.yml, and Dependabot now also tracks weekly GitHub Actions updates grouped by publisher.
• Dependencies: Bumped Vue to 3.5.39, Vuetify to 3.12.8, electron-builder to 26.15.3, Playwright to 1.61.1, prettier to 3.9.3, and other minor frontend/backend package versions. Relaxed the dompurify version constraint to T383838>=3.4.11 and added an T383838app-builder-lib>ajv override to keep transitive ajv versions compatible.
[4.7.1] - 2026-06-21
Fixed
• Android: APK startup no longer crashes with T383838library "libpython3.so" not found when loading cryptography 49 wheels. The Android wheel build rewrites PyO3 abi3 extension DT_NEEDED entries from the unversioned T383838libpython3.so SONAME to Chaquopy's T383838libpython3.11.so at pack time.
• Electron: T383838window.open for local backend popout routes (T383838#/popout/), call pages, and blob: URLs now opens a child Electron window with the app session instead of failing or delegating to the OS browser.
[4.7.0] - 2026-06-21
Fixed
• Messages: Conversation history preserves original message timestamps and sorts correctly when the API returns rows out of order.
• Messages / conversations: Outbound pending rows are deduplicated and reconciled when the conversation syncs so duplicate optimistic entries do not linger.
• Propagation: The local propagation node is started on boot when T383838lxmf_local_propagation_node_enabled is set in config (previously the setting could be on while the node never came up until toggled in the UI).
• Interfaces / discovery: Turning discovery off also disables autoconnect for that interface. Saving discovery settings shows a restarting RNS toast with a proper spinner. The interfaces list shows all discovered peers with allowlist status, and the allowlist is applied when configuration is saved. Backbone interface cards label IFAC tunnels vs public relays and show remote host/port or listen address where applicable.
• RNode: TX power values are validated and normalized before interfaces start so invalid power settings cannot crash Reticulum on startup.
• Network visualiser: Direct and multi-hop edges render again when the path table references interfaces missing from interface-stats (synthesized interface nodes). vis-network edge smooth options use the object form required by v9; physics pauses during node drag for smoother interaction.
• Path finder: Conversation and Nomad pathfinding UI shows clearer loading states and handles archive snapshots more reliably.
• Downloads: Shared T383838DownloadUtils parses T383838Content-Disposition filenames, routes API blob saves consistently, and uses the Android T383838saveDownload bridge when present. WebView downloads use a dedicated listener with cookie forwarding and safer filename handling.
• Page node (Nomad): File payloads accept bytearray bodies; existing files are registered during announces and listings.
• Chat UI: Outbound bubbles always show timestamps; the three-dot menu stays visible on orange and red outbound themes; timestamp and status icons remain readable on solid-colored outbound bubbles. Reply-quote previews wrap instead of truncating with T383838line-clamp.
• Relative time: Sidebar and list time ago strings use finer combined units (e.g. hours and minutes) instead of coarse single-unit rounding.
• macOS: DMG builds include the microphone audio-input entitlement so calls can use the mic without extra manual signing steps.
• Voicemail: Auto-answer no longer runs for callers whose identity or destination is blocked.
• Banishment: T383838is_destination_blocked treats an identity hash like a destination hash so voicemail, delivery, and other checks stay consistent with identity-level blocks.
• Identity / keys: Public key loading accepts both 64-byte and 128-byte keys; identity recall uses consistent hashing.
• Database: Snapshot download names include the T383838.zip extension; restore and backup paths handle identity storage correctly.
• Storage: Identity file path references and storage directory setup are more reliable across migration and restore flows.
• Relay chat: RelayChatPage layout and overflow handling on smaller screens.
• CI: setup-node runs before corepack on Ubuntu 24.04 so pnpm installs reliably; Micron WASM fetch and Electron coverage work with offline build flags.
• Docker: T383838pnpm-workspace.yaml is included in image build contexts.
• Android wheels: cffi metadata pinned for consistent pycodec2 wheel builds; RECORD regeneration for installable Codec2 wheels.
Added
• Security: App-wide web UI IP allowlist (settings + middleware), CSRF tokens on mutating HTTP routes (with T383838/api/v1/auth/csrf bootstrap), and an LXMF message blocklist tool/API with import/export and inbound delivery filtering.
• Messages: Cancel send for in-flight outbound LXMF messages (API, conversation UI, and localized strings).
• Attachments: Save image to device on Android (and shared download helpers elsewhere).
• RRC (Reticulum Relay Chat): Wire-compatible RRC client and local hub hosting (rrcd-style). Connect to remote hubs, join rooms, send messages, and host hubs locally. Member moderation for hub operators, keep-alive routing, message search, mention counts, and persisted hub history. Sidebar unread badge for relay chat; backup/restore includes RRC hubs and history files.
• RNSh: Remote shell tool with terminal session management, session resizing API, and config-directory support for saved sessions.
• LXMF reactions and replies (standard fields): Outbound reactions use T383838FIELD_REACTION (0x40) with T383838REACTION_TO and T383838REACTION_CONTENT. Replies use T383838FIELD_REPLY_TO (0x30) and T383838FIELD_REPLY_QUOTE (0x31). Parsing, delivery filtering, notification bell logic, and UI merge paths use the current LXMF field layout (legacy field-16 reaction payloads are no longer emitted or interpreted as reactions).
• LXMF delivery: When T383838auto_resend_failed_messages_when_announce_received is enabled, failed outbound messages for a peer are resent after a successful ping or when an announce arrives and a path is already available.
• LXMF stamps: UI for solving stamps with clearer tooltips and user feedback during proof-of-work.
• Messages / attachments: Improved file attachment handling; optional outbound transfer progress bar (speed, hops, elapsed time). Message import supports file upload with better error handling.
• Path finder: Shared T383838reticulumPathfinding.js helper for quick request, force find, and drop path + request. Available from the conversation peer header and the Nomad browser toolbar when a page load fails; Nomad also offers load latest archive snapshot when archives exist.
• Maintenance: T383838DELETE /api/v1/maintenance/path-table clears the Reticulum path table; settings UI exposes Clear Path Table with localized description.
• Crash recovery / diagnostics: Backend crash recovery with adaptive memory checks and improved logging. Electron persists backend crash reports, surfaces recovery hints in the loading UI, and can open the saved report from the desktop shell.
• Memory diagnostics: Optional T383838--memory-diag mode with T383838/api/v1/diagnostics/memory endpoints (snapshots, heap breakdown by type/category, GC, referrers). SQLite prepared-statement cache is capped to reduce long-lived backend memory growth.
• Frontend heap monitor: T383838HeapMonitor logs JS heap usage in development builds (T383838window.heapSnapshot when enabled).
• Network visualiser: T383838POST /api/v1/announces/query bulk endpoint for fetching many destination hashes in one request; faster graph hydration for large networks.
• Database: SQLite WAL mode and busy timeout for better concurrency. Multipart file upload for database restore. Backups include identity storage with manifest creation; restore flow supports relaunch after import with optional storage lock bypass.
• Offline / air-gapped builds: T383838scripts/create-offline-bundle.sh and T383838scripts/install-offline.sh, plus T383838pnpm run bundle:offline, T383838build:offline, and T383838:offline Linux dist targets that set T383838MESHCHATX_OFFLINE_BUILD=1.
• Map: MBTiles import and tile-provider logic improvements; export panel and metadata handling for exchange exports; localized file-drop hints for map layers.
• Micron editor / Mesh Server: Publish to Mesh Server defaults new pages to T383838index.mu; if T383838index.mu already exists and the tab still has a default name (New Tab), the editor prompts for another filename. Publish all tabs uses the same rules per tab.
• Nomad browser: Opening a node focuses an existing tab for the same destination (or opens a new tab when T383838forceNewTab is set). Restored tabs validate destination hashes and filter external URLs. Dark shell styling and readable inputs on dark full-bleed pages; external T383838http/T383838https links open in a new browser tab.
• Interfaces: Reworked interfaces page layout and discovery UX; API lists each interface’s allowlist membership. Minimum MTU validation for TCP client interfaces.
• Identities: Redesigned Identities page layout and translations.
• Telephony: Minimize control on active calls; call-related settings persist reliably across sessions (tests added).
• RNStatus: T383838speed_str helper for human-readable bitrate formatting.
• Codec2: Native Codec2 library integration in Android builds and CI workflows.
• Android: T383838AndroidStorageManager for internal vs external storage, migration, and setup options; refactored RNode interface handling; vendor wheel verification for aiohttp, cbor2, and cryptography.
• Electron: Backend process management and automatic recovery; patches for electron-installer-common glob handling and electron-builder filesystem constants.
• Flatpak: Wayland socket, zypak Chromium sandbox module, and updated appId in packaging metadata.
• Sticker utils: Bounded gzip decompression to prevent unbounded memory allocation on malformed payloads.
• Panes / tabs: Browser-style pane and tab improvements across Nomad and tool pages.
• Tools UI: T383838ToolsPageHeader component replaces ad-hoc headers on tool pages for consistent navigation and back links.
• Docs: Meta Quest headset installation guide; LXMF address updates across documentation.
• i18n: Finnish (T383838fi) locale. New strings for map, interfaces, RRC, transfer progress, maintenance, MTU hints, Micron editor publish prompts, call minimize, cancel send, save-to-device, security settings, and failed-message status across supported locales.
Changed
• Dependencies: LXMF updated to 1.0.1, RNS to 1.3.5, aiohttp to 3.14.1, cryptography to 49.0.0, lxst to 0.4.7, Electron to 42.4.0, Vite to 8.0.16, dompurify to 3.4.11, UV to 0.11.15; cbor2 added for RRC; pnpm workspace overrides bump transitive form-data, socks, tar, tmp, undici, js-yaml, minimatch, and brace-expansion for known advisories.
• Android: Chaquopy recipes and T383838build.gradle pin aiohttp 3.14.1 and cryptography 49.0.0; CI wheel verification updated for the new versions.
• Project URLs: Default homepage and documentation links moved from git.quad4.io to github.com/Quad4-Software/MeshChatX and official mirrors.
• Frontend: General styling refresh; Identities sidebar icon updated; MaterialDesignIcon uses centralized icon resolution.
• Interface discovery: Allowlist and blacklist pattern matching sanitizes patterns before matching.
• Android: Build metadata, wheel-fetch scripts (retries, local wheel paths), and PKGBUILD / Arch packaging now use a Python virtual environment.
• Electron / packaging: Legacy Electron Forge configs and scripts removed; desktop builds use electron-builder only. macOS target config uses an array form; CI can build additional Mac architectures.
• CI: Custom setup-node-pnpm action; GitHub release script excludes specific asset paths (T383838library.zip, T383838*.so.yml) and improves notes generation; Rust T383838x86_64-apple-darwin target for macOS builds; Node.js version verification in workflows.
• Tests: HTTP API route contract, interface discovery, call page, Micron editor publish, LXMF reaction field 0x40, RRC, RNSh, relay moderation, network visualiser bulk fetch and edge rendering, database restore, path finder / path-table maintenance, Nomad tab management, backbone interface labels, outbound cancel send, DownloadUtils, message blocklist, CSRF/IP allowlist, and notification user-facing filters updated for the above behavior.
Removed
• RNGit explorer: The in-app RNGit tool and its tests were removed.
• Electron Forge: Forge makers, config, and related packaging scripts (replaced by electron-builder workflows).
[4.6.2] - 2026-05-10
Fixed
• Build backend: Bytecode cleanup now only removes .pyc and .pyo files when a matching .py source file is present, so standalone compiled artifacts are not deleted accidentally.
• Propagation sync: Auto-select no longer lets a sync get stuck on an unreachable node. When T383838auto_propagation is enabled and the current propagation node loses its path while syncing, the manager stops the stuck sync and evaluates candidates to find one with a working path. If no candidate works, the broken active node is removed rather than restored. Stuck-sync detection also monitors path unresponsiveness and stale paths.
• LXMF / chat UI: Conversation sidebar and list APIs show one-line previews for image-only, voice-note (audio), and file-attachment messages (plus notification previews) instead of an empty subtitle. Server (T383838lxmf_sidebar_preview_for_conversation_latest_row) and client (T383838lxmfConversationListPreview) stay aligned, with locale strings and tests.
• Outbound images (pending row): Optimistic T383838pending-* messages no longer trigger a T383838GET /api/v1/lxmf-messages/attachment/pending-*/image 404 when the FileReader preview URL is not ready yet. The client falls back to an inline data URL from the outbound job payload and avoids using the attachment endpoint for pending hashes without a preview.
• Conversation loads: Stale responses from an older T383838lxmf-messages/conversation fetch (e.g. after switching peers quickly) are still discarded safely, without noisy console logging.
• Identity context: Guarded T383838inbound_stamp_cost comparison against non-integer values to prevent T383838TypeError.
• Config parsing: T383838configparser errors when reading configuration files are now handled gracefully to prevent crashes.
• Conversation cleanup: Blocking a destination now deletes the associated conversation to ensure proper cleanup.
• Call handling: Delayed hangup for rejected calls with improved contact lookup handling.
• Docs manager: T383838/meshchatx-docs/index.html now resolves correctly after generating an T383838index.html during docs population.
• Health monitor: Added garbage collection calls during context teardown and health checks to clean up resources.
• Ping error logging: Failed destination pings now log a clean T383838console.warn message instead of dumping the full T383838HttpError stack trace in browser dev tools.
• Trivy CI setup: Added curl retries (T383838--retry 5 --retry-delay 2) to handle transient 502 errors during Trivy downloads.
• Tests: Fixed multiple failing backend tests (T383838test_http_api_contract, T383838test_interface_discovery, T383838test_websocket_interfaces, T383838test_security_fuzzing, T383838test_telemetry_integration) for pytest compatibility, BoolConfig mocking, and RNS T383838get_instance changes. Added missing dev dependencies (T383838pytest-asyncio, T383838pytest-xdist, T383838pytest-cov, T383838jsonschema).
• Banishment: Blocking now targets the identity, not just a single destination hash. All known destinations for the same identity are blocked, contacts are deleted, and LXMF stamp/ticket state is cleaned up from T383838LXMRouter.
• Banishment (UI): Blocked destinations page groups entries by identity and shows all blocked destination hashes per identity. Unblocking one unblocks the entire identity.
• Banishment (Reticulum): T383838blackhole_identity() is always applied when available to drop packets before LXMF delivery callbacks reach the sender, preventing "phantom deliveries" to blocked peers.
• NomadNet file downloads: Backtick-separated request data (e.g. BT383838/file/artifactg=reticulum|r=lxmf|t=0.9.7BT383838) is now parsed and forwarded as var_*request data dicts, matching upstream NomadNet behavior. Previously the raw string was passed and remote nodes could not resolve the artifact.
• NomadNet file downloads (cancel): Fixed T383838AttributeError when cancelling a download. T383838RequestReceipt has no T383838.cancel(). We now cancel the underlying T383838Resource if present, or mark the receipt T383838FAILED and remove it from the link queue.
• NomadNet browser (links): Relative T383838/page/ and T383838/file/ URLs from the Micron parser (which include backtick parameters) are now parsed correctly so they no longer show "Unsupported URL".
• NomadNet browser (hover): Links with T383838data-destination now show the full URL including backtick parameters in the browser hover title.
• Docker build: T383838build-frontend stage now installs T383838python3 so docs generation succeeds in T383838node:24-alpine.
• Docs manager: Markdown tables in generated documentation render with proper borders and padding.
Added
• Android notifications: JavaScript interfaces in MainActivity handle notifications and incoming calls from the web layer. NotificationUtils now covers incoming calls, missed calls, voicemails, and messages on Android, with comprehensive tests across Electron, Android, and browser fallback.
• App / Messages: Unread conversation count updates when new LXMF deliveries arrive, including when the Messages page is not focused.
• Telephony: Voicemail session management and configuration updates. Telephony-related settings are surfaced in the UI.
• Toasts: Swipe-to-dismiss on touch devices. Horizontal swipes past 100px slide the toast out with opacity and transform feedback. Shorter swipes snap back.
• Mobile header: Propagation node sync refresh icon (T383838refresh) visible on small screens, mirroring the desktop button with the same loading spinner state and click handler.
• Micron (Nomad) (thanks to @RFnexus): MicronParser text inputs can upgrade to multiline textareas. Pressing Enter twice shows a hint. T383838multiline_hint was added for NomadNet strings across supported locales.
• Chat header (LXMF stamps): When the peer has an outbound stamp ticket (T383838outbound_ticket_expiry from stamp info), a ticket icon appears beside stamp cost. The icon is green while the ticket is still valid, amber after expiry, with localized tooltips.
• Connectivity (Android tooling): T383838usbserial4a dependency for USB serial support in the stack where used.
• FAQ: Added T383838FAQ.md covering common questions about LXMF reachability, project goals, AI usage, legacy support, and contribution policies.
• Password reset: Added T383838--reset-password CLI flag and T383838MESHCHAT_RESET_PASSWORD environment variable to clear the stored password hash on startup so a new password can be set via the web UI.
• Favourites import/export: Settings page now supports importing and exporting NomadNet favourites, with deduplication and icon handling.
• Bulk favourites import: Server-side bulk import endpoint for favourites with proper validation and merge logic.
• Call page flood protection: Added flood protection settings UI to the call page.
• NomadNet file downloads: Support for query-parameter data in file downloads. URLs like T383838hash:/file/report.pdf?version=2 parse the query string and forward it as request data through the WebSocket to T383838NomadnetFileDownloader, matching upstream NomadNet behavior.
• NomadNet query tests: Frontend and backend tests for T383838parseNomadnetworkUrl with query strings and T383838downloadNomadNetFile data payload handling.
• Android RNode protection: On Android, T383838RNodeInterface, T383838RNodeIPInterface, and T383838RNodeMultiInterface entries in the Reticulum config are automatically disabled before startup to prevent crashes from missing serial/BLE support in Chaquopy.
• Android external storage: On Android, MeshChatX now defaults to T383838getExternalFilesDir() (user-accessible via file managers) instead of private internal storage.
• CI (Linux packages): AppImage, deb, and rpm release assets are now built and tested on every push to T383838dev for both x64 and arm64.
• Docker: Added a hardened image variant (T383838-hardened suffix) with non-root user, read-only rootfs, and restricted capabilities.
• Map: Drag-and-drop import of GeoJSON, KML, and KMZ files directly onto the map window, with localized drop hint overlays.
Changed
• Dependencies: RNS updated to 1.2.5, LXMF to 0.9.7, aiohttp to 3.13.5 in Python, requirements.txt, Chaquopy metadata, and Android build.gradle, micron-parser lockfile refresh, and general pnpm / package bumps for 4.6.2.
• Vendored LXMFy: Refreshed T383838vendor/lxmfy from upstream LXMFy at T3838380a6ba8c9fd0f306be614d0edce44e4e805c025b0 (LXMF field helpers for structured bot commands, expanded docs, and new tests). Bundled package version remains 1.6.2. T383838vendor/README.txt lists the revision pointer.
• CI: Docker images publish the :latest tag on version tag pushes, main and master branch builds are enabled, and the Bunny Storage release folder is pruned before uploads. Release descriptions now include a SHA256 checksum table for all assets.
• async_utils: Tighter coroutine scheduling limits with logging when work is dropped. Removed the Python 3.13 asyncio compatibility patch in favor of cleaner scheduling assumptions. Adds regression tests for HTTPS file responses (including sendfile-style paths).
• reticulum_config: Default Reticulum configuration is applied via file-backed writes instead of embedding large default text only through the previous helper path (tests updated).
• Lint tooling: T383838vue-eslint-parser added/updated (10.4.0) for frontend ESLint alignment.
• Contributors: zenith added to CONTRIBUTORS.
• Announce limits: Default T383838announce_max_stored_* raised from 1000 to 2500 and T383838announce_fetch_limit_* from 500 to 2500 so the API lists everything stored in the database by default, matching public network usage.
• Sidebar order: Reordered sidebar so Telephone appears directly below Messages for faster access.
• Telephone announce: Disabled by default in T383838config_manager.
• CONTRIBUTING.md: Updated generative AI policy to emphasize local/offline models and reference the Reticulum Zen and License.
• Dependencies: Migrated Python dependency management from Poetry to UV (0.11.12) across all CI scripts, Dockerfiles, and dev tooling. T383838poetry.lock replaced with T383838uv.lock.
[4.6.1] - 2026-05-04
Fixed
• Micron pages (JavaScript renderer): Long lines on Micron pages now wrap more reliably instead of running off the edge awkwardly.
• Nomad browser: The Micron JavaScript / WebAssembly switch in the toolbar (and switching engines in general) works on every Micron page link, including ones with extra parameters in the address which caused issues.
• macOS app (Intel + Apple Silicon in one download): Building the combined Mac app could fail with a merge error because some bundled audio pieces looked identical in both halves. The build now trims native add-ons to either Apple Silicon or Intel before they are merged, and install scripts on Mac CI rebuild the miniaudio piece from source when needed so the merge step succeeds.
[4.6.0] - 2026-05-04
TL;DR
• Micron WASM parser: Go-based WASM parser for Micron pages that falls back to JavaScript when WASM is unavailable or disabled. Micron Parser JS stays the default renderer. The WASM engine can stay enabled for updates while you choose JavaScript or WebAssembly as the default in settings or from the Nomad browser toolbar. The WASM binary is upgradable in settings (GitHub releases or local upload).
• Security and integrity: SRI checks for external scripts (Codec2, RNode Flasher) and Micron WASM with build-time manifests. Release workflows emit SLSA provenance for Android APK and Flatpak. T383838SECURITY.md explains attestation alongside the SRI notes.
• File downloads: When you save or export things (including from archives), filenames are cleaned up so odd characters are less likely to break saves. You get clearer feedback when a download wraps up.
• NomadNet favourites: You can import and export your NomadNet favourites list on a new device without retyping everything. Contact sharing wording is clearer across several languages.
• RNGit Explorer: New in-app explorer for RNGit.
• Android: Foreground sync with notifications, WebSocket bridge hooks, calls and richer audio (including native attachments), optional camera manifest wiring, APK sharing via the system share sheet, plus Lint in CI and toolchain updates.
• LibreTranslate: Optional API key support for self-hosted or public instances with improved configuration persistence.
• Bot management: Subprocess error tracking, log retrieval, and better lifecycle handling for LXMFy bots.
• Map improvements: Removed MapNoMapWarning component, streamlined offline mode handling, and improved coordinate display with tabular formatting.
• Telephony: Call metadata tracking with path hops and interface details, plus ringtone handling for browser autoplay restrictions.
• Reticulum and announces: Bootstrap-only defaults for new outbound TCP and backbone connector interfaces (with discovery and add-interface options), per-aspect announce storage toggles in T383838announce_manager and T383838config_manager, and refreshed community interface presets (builder script and list cleanup).
• Chat UI: Clearer outbound propagation status in threads, clipboard helpers for secure and non-secure contexts, and Tailwind CSS 4 with the Vite plugin and a slimmer frontend config footprint.
• Settings and locales: Privacy, message auto-delete, community preset strings, bootstrap node search copy, LibreTranslate API key, migration copy, identity and sending options, and outbound propagation status translations across supported languages.
• Storage migration: Reworked legacy storage migration with an API, tutorial choices, automatic upstream folder moves where needed, and aligned Docker, Electron, and test paths for old layouts.
• Release CI: Optional Bunny Storage uploads for release assets and clearer tag resolution in the main release workflow.
Micron WASM parser (Micron-Parser-Go)
• Micron-Parser-Go WASM: Go-based WASM implementation for Micron page parsing with word wrapping, space splitting, and ForceMonospace CSS injection. Micron Parser Go is pinned to v1.0.5.
• Configuration: Micron WASM engine toggle (default on) allows loading and updating the WASM build. T383838nomad_micron_default_engine (T383838js or T383838wasm, default T383838js) sets the default Micron renderer separately from the toolbar. T383838micron_parser_go_version pins the WASM binary version.
• Dynamic loading: WASM binary fetched and cached with SRI verification against T383838integrity.json manifests.
• Fallback behavior: Graceful fallback to JavaScript parser when WASM is unavailable or fails to load.
• Docker support: Scripts fetch and resolve Micron WASM binaries during Docker builds with version pinning.
Security and integrity
• SRI verification: Subresource Integrity verification for Codec2 and RNode Flasher external scripts with T383838integrity.json manifests. Codec2 WASM loading uses T383838locateFile so asset paths resolve reliably next to integrity checks.
• Micron WASM integrity: Generated T383838integrity.json for Micron WASM assets with SHA-384 hashes verified at load time.
• Security documentation: Updated T383838SECURITY.md with SRI details for external code and CI integrity tests plus SLSA notes for APK and Flatpak artifacts.
• Community interfaces: SSRF protection with URL validation and fetch handling for community directory requests.
Bots and LXMFy
• Bot error handling: Subprocess last error tracking and log retrieval for bot instances via T383838GET /api/v1/bots/{id}/logs.
• LXMFy vendor integration: Vendored LXMFy dependency for bot framework functionality.
• Configuration: Improved bot configuration persistence and validation in T383838config_manager.
LibreTranslate
• API key support: Optional API key field for LibreTranslate configuration in settings with secure storage.
• URL validation: Loopback-only URL normalization and validation for LibreTranslate service endpoints.
• Configuration persistence: Improved T383838libretranslate_url and T383838libretranslate_api_key handling with live probing.
Map and visualization
• Simplified offline handling: Removed MapNoMapWarning component and streamlined offline mode logic.
• Coordinate display: Improved tabular formatting for coordinate readouts in the map UI.
• Geolocation permissions: Android geolocation permissions for map and LXMF telemetry functionality.
Telephony and calls
• Call metadata tracking: Real-time display of path hops, interface details, and RTT during active calls.
• Ringtone handling: Improved browser autoplay restriction handling for ringtone playback with fallback strategies.
• Telephone announcements: Configurable announcement enabling for telephone functionality.
Android platform
• APK sharing: T383838shareApk method in AndroidBridge for sharing the installed APK via system share sheet.
• File sharing utilities: Native file sharing integration for mesh content.
• Geolocation permissions: Added fine/coarse location permissions for map and telemetry features.
• Notification improvements: Better audio settings permission handling and back navigation responsiveness.
• Versioning: Bumped to 4.6.0 with updated feature flags.
Tools and path utilities
• RN path trace: Improved error handling and validation in path trace and probe handlers.
• NomadNetwork pathfinding: Integrated reticulum pathfinding into NomadNet downloads for better link establishment.
• Failure detection: Simplified T383838isFailedPageContent method with dedicated tests for page load failure detection.
Downloads, archives, and frontend utilities
• Downloads: File download flow adds persistence, user notifications, and filename sanitization so exports land predictably and bad names are rejected or normalized safely.
• Refactors: Download helpers and time formatting utilities consolidated. UI elements updated where downloads surface.
• Tests: T383838DownloadUtils unit tests. T383838Utils tests updated for formatting helpers. T383838ArchivesPage test accounts for delayed T383838downloadTextAsFile behaviour.
NomadNet and locales
• Favourites: Import/export for NomadNet favourites from the app.
• Locales: Contact sharing options and related strings refreshed across supported languages. RNGit Explorer strings added and localization tables aligned for consistency.
• Locales: Bootstrap node search copy and settings strings for privacy, message auto-delete, and community preset management. Outbound message propagation status labels for the conversation UI.
RNGit Explorer
• Backend: T383838rngit_tool introduces the RNGit explorer capability.
• Frontend: RNGit Explorer page with sidebar and navigation integration plus a localized experimental footer notice.
• Tests: Coverage for server behaviour and frequency conversion paths used by the tool. Obsolete RNGit database announcement conversion test removed.
Android
• Gradle: Product flavors removed. Python sync task simplified to match the single packaging path.
• Paths: Taskfile and CI workflows updated for the new APK and Python directory layout.
• Docs: Android README sections updated so they no longer talk about removed flavors.
• Sync and notifications: Foreground service for message synchronization with user-facing notification copy. WebSocket integration in T383838meshchat_wrapper and an Android push bridge so the UI can react to backend events.
• Reliability: Server loop control and clearer error handling around the notification bridge.
• Calls and media: Call handling, notification channels, permissions, and shortcuts. Native audio attachment support with improved message routing and in-app audio navigation. TelephoneNativeAudioSession and WavPcmAttachmentRecorder encapsulate record creation and permission checks.
• Manifest: Camera added as an optional feature where appropriate. Duplicate optional camera and microphone feature declarations removed from T383838AndroidManifest.xml.
• Toolchain: Gradle plugin and SDK bumps, dependency refresh, and Lint configuration.
• CI: Android Lint runs in the workflow with report artifacts uploaded for review.
MeshChat UI, conversations, and microphone
• Conversations: UUID-based pending message hashing, viewport resize handling updates, date divider styling for accessibility, and list previews that prefer display names with small telemetry polish.
• Getting started: Identity screen added to the onboarding flow.
• Audio: Native WAV attachment availability checks and clearer recording source wiring.
• Main shell: T383838App.vue uses a polling guard so refresh work cannot overlap.
• Command palette and visualiser: Visualizer entries trimmed from the command palette and NetworkVisualiser physics simplified.
• Outbound status: T383838meshchat message updates accept a method parameter with method-to-state mapping so propagation outcomes read consistently. T383838ConversationViewer shows clearer propagation state titles. Tests cover outbound propagation status behaviour.
• Clipboard: T383838clipboardUtils.js improves copy / read for secure and non-secure contexts when T383838navigator.clipboard is missing or rejects.
• Layout: Responsive height class tweaks on T383838App.vue and T383838AuthPage.vue.
• Styling: z-index values standardized and class naming cleaned up across multiple components.
• Microphone: T383838microphoneRecorder can capture via AudioWorklet or ScriptProcessor for better performance and compatibility across environments.
Desktop (Electron)
• Storage and quit: User data directory naming matches the migration layout. Quit handling is more predictable.
Reticulum config, discovery, and display
• Bootstrap-only interfaces: Discovery and Add Interface flows can mark new TCP client and backbone connector interfaces T383838bootstrap_only so Reticulum can detach them after T383838autoconnect_discovered_interfaces is satisfied. Defaults stay configurable under Interfaces.
• Announce storage: T383838announce_manager wires per-aspect persistence (T383838announce_store_*) through T383838config_manager so LXMF, telephony, NomadNet, propagation, and RNGit aspects can be stored or skipped independently.
• Interface editor: T383838coerce_rnode_frequency_hz normalizes frequency values written into Reticulum config.
• Discovery helpers: T383838parseRNodeFrequencyHz interprets frequency fields from API-style payloads.
• Formatting: T383838formatFrequency in T383838Utils rejects or handles non-finite values safely instead of producing garbage output.
Community interface presets
• T383838build_community_interfaces: JSON fetch uses a dedicated interface builder instead of a one-off fetch helper.
• Preset list: Removes stale TCPClientInterface bootstrap entries and adds user-submitted community interfaces.
Version source and sync scripts
• Single source of truth: Runtime version is read from T383838src/version.py, which is kept in lockstep with root T383838package.json (including T383838__init__.py where applicable).
• T383838version:sync: Script updates multiple files in one pass. Follow-up fixes keep README version lines in translated docs consistent and easier to maintain.
Repository server and bundled wheels
• Bundling: Logic to stage a local MeshChatX wheel into the bundled directory and refreshed download behaviour for repository assets.
Database
• Identifiers: Sanitization for dynamic PRAGMA names and WAL checkpoint modes.
• Startup: Legacy inline migrator removed from default database init in favour of the dedicated migration flow.
CI, release automation, and supply chain
• GitHub Actions: Migrated primary workflows from Gitea. Obsolete Gitea workflow files removed.
• Workflow hygiene: Flatpak CI cleaned up. Deprecated Snap build scripts removed from the tree.
• Caching: Node.js and Poetry caches added where workflows install tooling.
• Docker publish: Workflow gains Docker Hub integration, tag generation, and a login fix so credential detection output is used consistently.
• Android release: Workflow updates for tag handling, signing secret detection, APK upload behaviour, and Lint (see Android section for product impact). Tighter APK signing and build rules on dev and master.
• macOS builds: Codec2 install path fixes for x64 and improved Homebrew detection plus env setup for cross-arch jobs.
• SLSA: Release workflow generates SLSA provenance for Android APK and Flatpak artifacts (see Security section for docs).
• Benchmarks: Taskfile default benchmark task and workflow trigger alignment. Expanded benchmark suite covering contacts, config, telemetry, debug logs, map drawings, voicemail, and access attempts with JSON output and results caching.
• Alert thresholds: Updated benchmark alert and fail thresholds for improved variance handling in CI.
• Draft releases: Script sets T383838GH_REPO from T383838GITHUB_REPOSITORY when unset.
• Asset attestations: Workflow excludes additional file types from attestation and disables tlog upload where that was causing friction.
• Trivy: Build and security scan workflows include explicit setup and update steps. Install script gains upstream verification and cosign integration.
• pip-audit: T383838CVE-2026-3219 ignored temporarily with a documented rationale until an upstream fix lands.
• Tests: Minor formatting tidy-ups in the test tree. T383838test_app_status_tracking uses T3838384.6.0 as the example T383838changelog_seen_version stamp so it tracks the release. Added coverage for T383838android_push_bridge, T383838meshchat_wrapper, T383838rngit_tool, and Micron WASM (including wrapper server loops, frequency conversion, and WASM loading). T383838http_api_routes.json contract updated for new routes. Transport announce-handler registration test expectation fixed. NomadNetwork regression tests for WebSocket download status. Telephone initiation timeout increases for stability. MarkdownRenderer lxmf link detection tests. WebSocketConnection invalid JSON frame handling.
Docker, compose, and documentation
• Dockerfile: Optional reproducible native build target wiring. OCI-style metadata and image source hints refined. T383838docker-compose.yml image reference and volume layout aligned with README examples. Build context drops unnecessary legacy Tailwind config files.
• Flatpak: Custom desktop template, permission tweaks, and removal of the Pipewire socket from the Flatpak config.
• Docs: README and translated READMEs add Docker Hub and GHCR guidance plus copy-paste T383838docker run examples where helpful. Browser requirements called out where relevant. Official GitHub mirror links refreshed. GitHub Actions references replace Gitea-era wording. Security policy and SECURITY formatting polish. Raspberry Pi install examples use T383838bash fences consistently.
Tailwind and Vite frontend
• Tailwind CSS 4.2.4 with T383838@tailwindcss/vite. Obsolete Tailwind config files removed and T383838style.css updated for the new setup.
[4.5.1] - 2026-04-24
Identity switching
• Hotswap API: Identity switch responses now include display name and identity hash so the client can refresh state without guessing from partial payloads.
• Event handling: Identity switch events are deduplicated in T383838App.vue and T383838IdentitiesPage.vue so rapid or repeated signals do not stack duplicate work.
• Locales: Confirmation copy for switching identities no longer tells users to restart when that is not required (aligned strings across supported languages).
• Tests: New HTTP coverage for the identity switch API (success paths, validation, and error responses).
Desktop (Electron)
• Boot experience: Splash screen on startup and Codec2 loader scripts use retry logic so transient load failures are less likely to strand voice features.
• Developer tools: F12 toggles DevTools; the menu bar auto-hides in main windows for a cleaner ui.
• Content Security Policy: CSP now allows T383838wasm-unsafe-eval and blob: where needed so WebAssembly used by the stack (for example audio codec paths) can run under the hardened policy.
Microphone and translations
• Recording: Microphone capture updates error handling and adjusts AudioWorklet import so failures surface more reliably instead of failing silently.
• Locales: New and updated strings for microphone errors so users get clearer guidance when capture or permissions go wrong.
[4.5.0] - 2026-04-23
TL;DR
• Android App!: MeshChatX now has a native Android app you can install (not just for Termux users).
• Linux Packaging: Added Snap and Flatpak initial support.
• Copy Messages: Added right-click context menu item to copy a message.
• Sync Messages: When you tap Sync Messages, you’ll just see a simple "Syncing..." label instead of weird technical terms.
• Dark Mode Improvements: The dark theme’s accent colors now look more consistent and easier on the eyes.
• Announcements: The app now handles timed announcements and reminders in a way that's more predictable and easy to understand.
• Hot Reload RNS: You can now restart the Reticulum network stack directly from MeshChatX if there’s a problem.
• Config Editor Tool: Added config editor tool to edit within app.
• Repository Server Tool: New Tool for the optional local file shelf to redestribute reticulum and meshchatx python wheels locally or any file you upload.
• Dangerous Links: The app can warn you before you open links from people you don’t know, if you happen to click on it by mistake.
• Message Rules: New sieve tool for simple patterns. Matching stuff can land in the right folder, quiet the notification bell, or other actions you pick.
• Chats, Images and Reactions: Bigger chats load faster, images are grouped and sized better, styling improvements to reactions.
• Looks and Effects: You can make parts of the UI transparent or enable a "glass effect" look, with clear settings to control these options.
• Simpler Internals: The app’s settings and chat features were reorganized behind the scenes, making it easier to maintain and more stable.
• Visualiser Improvements: The visualiser now handles really big or complex networks much more smoothly. Also added better incremental hop slider and set default to 4 hops for faster and less laggy loading. The slider will also remember what you set.
• Easier Device Connections: Advanced users can now see special codes (IFAC) that help with connecting certain types of interfaces here and via the API.
• Better Reliability: The desktop (Electron) app recovers better from connection problems and crashes.
• Audio Without ffmpeg: Voicemail, ringtones, and microphone capture use in-process encoding (LXST / miniaudio) so containers and minimal installs no longer need an ffmpeg binary for those paths.
• Calls and Microphone: Picking input and output devices is less fiddly, permission edge cases recover more gracefully, and the microphone path through the browser stack has improved.
• Bundled Offline Docs: In-app documentation can include the Reticulum manual, fetched at build time and bundled for offline reading; the docs page upload and sharing flow is smoother. Docs will also actually start on proper manual page.
• More Languages: Spanish, French, Dutch, and Chinese options were added to the app’s language selector.
• Message Size Limits: You can now set how big incoming messages can be (from 1MB up to 1GB) with easy presets or custom values.
• Interface Options: The Add Interface page now exposes the full set of options the Reticulum stack supports.
• Map: Another free map style, improve tile caching to show offline, mbtiles take priority, and improved markers.
• Nomad Browsing Path Finder: Path finder tool that shows on failed links to pages, allowing you to manually try a bunch of path finding methods.
Platform and backend
• MeshChat utils: T383838convert_propagation_node_state_to_string maps T383838LXMRouter.PR_PATH_TIMEOUT to T383838path_timeout so the API can report path timeouts distinctly from other failures.
• Propagation nodes / sync: Local propagation node lifecycle (start/stop/restart), stats and sync APIs; sync path logic for outbound propagation nodes, immediate completion for local nodes, and peer/unpeered statistics; settings expose transfer limits in MB and related UI/API wiring.
• LXMF incoming delivery limit: T383838PATCH /api/v1/config clamps T383838lxmf_delivery_transfer_limit_in_bytes to at most 1 GiB (was 100 MB); T383838LXMRouter.delivery_per_transfer_limit updates live when the value changes.
• Auto-announce / intervals: Refactor around T383838interval_action_due in T383838meshchat.py to simplify when auto-announce and propagation sync checks run; add tests for auto-announce behaviour.
• Reticulum: User-triggered RNS restart with UI feedback; reload streamlines teardown, loading indicators, and cleanup of identity state during Reticulum reload.
• Notifications: Filters silent or non-user-facing LXMF payloads so the notification bell does not fire on control-only traffic.
• LXMF sieve filters: T383838lxmf_sieve.py with T383838GET/T383838PUT /api/v1/lxmf/sieve-filters; T383838normalize_lxmf_sieve_filters / T383838parse_lxmf_sieve_filters_json; rules match peer/message text (substring or regex) and can suppress notifications, hide peers, route to folders, or banish; wired through ingest, sidebar, and notification paths; T383838config.lxmf_sieve_filters_json persistence; tests T383838test_lxmf_sieve.py, T383838test_lxmf_sieve_fuzz.py.
• Announce trimming: T383838trim_announces_for_aspect keeps favourited destinations and saved contacts when capping announce noise.
• Map: Deduplication helpers for telemetry markers and discovered map nodes; geodesy helpers, tile network management, OpenFreeMap support, and MBTiles export tile limit plus unique tile counting in T383838map_manager; tile caching refactor.
• AutoInterface / user guidance: Detects bind/listen failures (e.g. address already in use) and emits clear operator guidance.
• Interface discovery: Connect logic honours autoconnect metadata from discovery responses when the stack provides it.
• Translation (Argos): Refactored Argos Translate CLI detection; integration tests for forwarding behaviour.
• Docs bundle: T383838scripts/build/fetch_reticulum_manual.py (via T383838pnpm run build-docs) fetches the Reticulum manual for offline docs; backend wiring serves bundled manual content.
• Bots: T383838bot_handler updates for LXMF address normalization, reading addresses from sidecar files, improved bot names and on-demand announce requests, and tests.
• Telephony: T383838TelephoneManager improvements for path discovery, initiation, polling, and cancellation; integration tests for LXST classes and WebAudioBridge mocks.
• WebAudioBridge: Adds a client only when a call is actually active.
• Codec2 microphone: T383838Codec2MicrophoneRecorder uses a silent tap for processing and resumes the audio context reliably.
• Microphone (worklet): AudioWorklet-based mic processing and audio graph wiring; ESLint T383838AudioWorklet globals for worklet modules.
• Repository server: T383838RepositoryServerManager (T383838repository_server_manager.py) with T383838/api/v1/repository-server/ status, list, upload, delete, refresh-bundled, and HTTP start/stop/restart; wheel fetch uses urllib only (no pip subprocess); file copy skips existing files only when size matches; T383838fetch_repository_wheels.py and build wiring for bundled wheels; T383838repository-server-bundled kept out of generic package data where appropriate.
• App info / diagnostics: T383838/api/v1/app/info (and related handlers) with safer memory, network, and database stats; tests for missing runtime objects and version resolution without the packaging module.
• Media conversion: Voicemail, ringtones, and MicrophoneRecorder capture use WAV/PCM and OGG/Opus via LXST with miniaudio instead of shelling out to ffmpeg (Alpine Docker images drop the ffmpeg package accordingly). Browser-recorded WebM/Opus attachments decode through the same T383838audio_codec path and re-encode to OGG/Opus for LXMF; if conversion fails the original bytes are passed through unchanged. Python JIT status surfaced where applicable; related tests updated.
• Docs manager: Safer forced directory removal (T383838_remove_tree_force_writable) and writable-directory helpers when replacing tree content; clearer document sourcing and rendering for in-app docs.
• Python / tooling: Poetry lock updated (e.g. 2.3.4); rns >=1.1.9 and lxmf >=0.9.6; lxmfy pinned to a compatible commit; Electron 41.x series; Node engine >=24 with pnpm store integrity verification in T383838.npmrc and CI install scripts; lockfile/git-URL dependency style updates; T383838package.json metadata adds desktop entry, vendor, and synopsis where applicable.
• Build / unify: Script to align per-architecture cx_Freeze outputs so unified bundles stay consistent across arches; post-freeze cleanup strips redundant T383838meshchatx public assets and trims Python bloat; T383838electronLanguages lists packaged locales; T383838cx_setup.py excludes extra modules and bumps optimize.
• Android runtime integration: Added Android app startup hardening for Chaquopy and WebView, including startup retries, in-app startup errors, runtime permission flow (audio/Bluetooth/notifications/microphone), battery optimization exemption, ABI splits, optional local wheel builds (bcrypt/psutil recipes, Rust for bcrypt, PyO3/OpenSSL-related patches), cryptography and WebView media tweaks, and release minification rules for APK builds; Gradle slim / full product flavors with repository-bundled wheels for the fuller variant; Chaquopy-synced Python trees ignored in T383838.gitignore / T383838.prettierignore; APK signing glob fix in T383838sign-android-apks.sh.
• Licensing: Relicensed Quad4-owned portions under 0BSD and kept upstream Reticulum MeshChat portions under their original MIT notice in T383838LICENSE. SPDX identifiers added across the tree; T383838license_scope_mapper assists SPDX recommendations; T383838licenses_collector enriches frontend dependency notices (package.json parsing, workspace-root filtering, detailed T383838THIRD_PARTY_NOTICES / T383838licenses_frontend.json generation).
• GIFs: Schema and T383838database.gifs DAO; T383838gif_utils validation and naming; HTTP T383838/api/v1/gifs CRUD, T383838…/image, import/export, use-from-message, and T383838DELETE /api/v1/maintenance/gifs; configurable limits via T383838config_manager where applicable.
• Sticker packs: T383838database.sticker_packs and T383838sticker_pack_utils; T383838/api/v1/sticker-packs (list, create, install, reorder, delete, export) complementing per-sticker routes; stickers DAO/schema updates for pack association and animated assets.
• Reticulum config file: T383838GET/T383838PUT /api/v1/reticulum/config/raw, T383838POST …/reset, with editor-focused tests and safe merge behaviour against T383838config_manager.
• Media hardening: Backend and frontend tests for GIF, sticker, and Lottie paths (fuzzing, HTTP media routes, size/type checks).
• LXMF send path: Clearer handling and diagnostics when message sending fails (timeouts, path errors); tests cover failure modes.
• Interfaces API: Discovery responses include IFAC fields where the stack provides them; tests for discovery behaviour.
• Interfaces API (full options): T383838POST /api/v1/reticulum/interfaces/add now accepts the full RNS option matrix per interface type. AutoInterface persists T383838group_id, T383838discovery_scope (validated against T383838link/T383838admin/T383838site/T383838organisation/T383838global), T383838discovery_port, T383838data_port, T383838multicast_address_type (T383838temporary/T383838permanent), T383838devices, T383838ignored_devices, and T383838configured_bitrate. TCPClientInterface gains T383838connect_timeout, T383838max_reconnect_tries, and T383838fixed_mtu alongside existing T383838kiss_framing/T383838i2p_tunneled. TCPServerInterface adds T383838i2p_tunneled. BackboneInterface now supports a listener mode (T383838listen_ip/T383838listen_port/T383838device/T383838prefer_ipv6) in addition to the existing connector mode. RNodeInterface persists T383838flow_control and T383838id_callsign. KISSInterface/T383838AX25KISSInterface persist T383838flow_control, T383838id_callsign, and T383838id_interval in addition to the existing serial/framing knobs. I2PInterface exposes the T383838connectable flag.
• Interfaces port-in-use validation: New T383838meshchatx/src/backend/interface_port_check.py module probes the requested host/port before the configuration is written. TCPServerInterface and BackboneInterface (listener mode) listen-port collisions, UDPInterface listen-port collisions, and AutoInterface T383838discovery_port/T383838data_port collisions return HTTP 409 with a translated message (host, port, and conflicting interface name) so the operator can pick a free port instead of restarting into a broken interface.
• Wifi transport: T383838WifiTransport open paths use simplified signatures and stricter validation.
Frontend and UX
• Propagation sync (App header): After T383838GET /api/v1/lxmf/propagation-node/sync, the client polls propagation status on an interval while the router is in a transfer state, updates a keyed loading toast (T383838propagation-sync-status) with translated strings (T383838app.propagation_sync_live, T383838app.propagation_sync_state.*), dismisses it when the transfer ends, then shows the existing success or error summary. Stopping sync clears the poll timer and dismisses the live toast; beforeUnmount cleans up if you leave the page mid-sync. Removed the old toolbar pattern T383838Syncing... ({state}) in favour of T383838app.syncing plus the toast.
• Link detection: Updated Reticulum link detection to support T383838lxmf: prefix and prevent false positives for bare hashes. T383838link-utils now validates URLs more strictly before rendering.
• Propagation nodes UI: Settings and tools surface propagation node controls, transfer limits (MB), sync, and Material icons for node state; locales updated.
• Incoming message size (Settings / Propagation Nodes): Preset selector (1 MB, 10 MB, 25 MB, 50 MB, 1 GB) and custom amount with MB or GB unit; shared helpers in T383838meshchatx/src/frontend/js/settings/incomingDeliveryLimit.js; en / de / it / ru strings (T383838app.incoming_message_size*).
• Stranger links and sidebar: Config options for warning on stranger-originated links and Messages sidebar position; UI and en / de / it / ru strings.
• Theme: Dark theme accent palette updates for consistency; tests adjusted where they assert colors.
• Appearance: UI transparency and glass effect settings (with i18n) and related layout tweaks in T383838ConversationViewer and scrolling behaviour.
• Message list performance: T383838@tanstack/vue-virtual-based virtualization, image group display, and shared scroll utilities for long threads.
• Links and Markdown: T383838link-utils hardening (anchor protection, trailing punctuation); Markdown fixes for underscores in links vs italics with expanded tests.
• Modularity (settings and messages): Config fetch/merge, T383838PATCH /api/v1/config, color normalization, transport enable/disable, maintenance HTTP calls, and visualiser T383838localStorage prefs live in T383838meshchatx/src/frontend/js/settings/ (T383838settingsConfigService, T383838settingsTransportService, T383838settingsMaintenanceClient, T383838settingsVisualiserPrefs); T383838SettingsPage delegates to those modules. Message renderability, telemetry-only detection, image-only detection, and drag/paste image extraction are in T383838conversationMessageHelpers.js with thin T383838ConversationViewer wrappers.
• Shell and settings UI: Emergency and WebSocket status banners extracted to T383838AppShellBanners.vue; conversation peer chrome to T383838ConversationPeerHeader.vue; reusable T383838SettingsSectionBlock.vue (used for the stranger-protection section).
• Pages polish: About, Call, Debug logs, and Settings pages with clearer layout, app info, environment paths, log copy-to-clipboard, and error handling; related tests.
• Call (audio devices): T383838getUserMedia fallback and clearer error handling when inputs/outputs or permissions misbehave.
• ConversationViewer: File input clears after selection and improves image-type detection for uploads; GIF picker and drag/drop upload to the GIF library; animated stickers and GIFs can use T383838InViewAnimatedImg so heavy animations run only when visible.
• Stickers UI: T383838StickerPacksManager, T383838StickerEditor, T383838StickerView, and T383838tgsDecode (T383838.tgs / Lottie JSON) integrate with the composer and identities settings.
• Tools: T383838ReticulumConfigEditorPage for editing Reticulum configuration from the app with validation feedback; T383838RepositoryServerPage (T383838/tools/repository-server) for status/list, HTTP server start/stop/restart, upload/delete, and refresh-bundled against T383838/api/v1/repository-server/ (command palette + Tools grid); RNode firmware tooling gains expanded diagnostics, device management, and i18n for flash and probe flows.
• Docs page: T383838DocsPage upload and sharing behaviour polished alongside offline manual bundling; Reticulum manual links follow the active locale where applicable.
• Sieve Filters page: T383838SieveFiltersPage with T383838GET/T383838PUT /api/v1/lxmf/sieve-filters wiring and notification-suppression behaviour in the UI; route and sidebar/tool entry points; i18n for rule copy.
• NomadNetwork: Path finder dropdown and improved error handling when a page load fails; translated strings.
• Telemetry: Telemetry history modal with battery sparkline/chart components for timeline review.
• Map UI: OpenFreeMap and tile URL config updates; bearing mode; vector exchange panel; improved export UX; map link utilities on conversation messages; query-param handling and clearer error toasts; marker clustering and drawing component refactors; T383838willReadFrequently on read-heavy canvas paths; T383838clampFloatingToViewport shared helper so dropdowns stay inside the viewport (T383838DropDownMenu and other surfaces).
• Electron shell: CSP allows OpenFreeMap image/font/connect sources alongside existing tile providers.
• Fonts and map deps: T383838@fontsource/noto-sans, T383838jszip, and pinned/patched T383838ol / T383838ol-mapbox-style for vector map styling.
• LXMF reactions: Reaction controls and message row layout tuned for small screens and long emoji strips.
• Add Interface page (full options): T383838AddInterfacePage.vue renders type-specific sections for every option the backend now accepts. AutoInterface has a dedicated form (Group ID, Discovery Scope, Multicast Address Type, Discovery Port, Data Port, allowed and ignored devices, configured bitrate). TCP Client exposes KISS framing, I2P tunneled, connect timeout, max reconnect tries, and fixed MTU toggles/fields. TCP Server / UDP add device and prefer IPv6 controls; TCP Server also exposes I2P tunneled. BackboneInterface has a Listener mode toggle that swaps between connector (remote/target/transport identity) and listener (listen IP/port/device/prefer IPv6) layouts. RNode sections add spreading factor, coding rate, flow control, ID callsign, ID interval, and airtime limit long/short. Serial/KISS/AX.25 KISS sections expose baud rate, data bits, parity, stop bits, preamble, TX tail, persistence, slot time, flow control, beacon callsign/interval, and AX.25 callsign/SSID. I2P gains a connectable toggle. Every new field round-trips through T383838saveInterface, T383838loadInterfaceToEdit, T383838applyConfig, and T383838buildPayloadFromImportedConfig so editing and quick-import flows keep parity with the form.
• Network visualiser: Chunk and icon rendering tuned for large node sets (see TL;DR); optional max hops filter with T383838localStorage persistence alongside the hop slider prefs.
CI and packaging
• CI hygiene: pnpm store caching removed from CI and security-scan workflows; CodeQL for GitHub with T383838build-mode: none (no manual build block); install scripts run T383838poetry check and verify pnpm store integrity; Linux runners install libopus / libogg so Opus encode tests pass.
• Supply-chain monitoring: Rekor monitoring workflow plus T383838rekor-cli install helper script.
• Release assets: GitHub release notes generation includes integrity / SBOM-style detail; per-file SHA256 sidecar checksums removed from the main build-test flow; T383838SECURITY.md points readers at cosign / attestation-style verification instead.
• Frontend CI: Reusable frontend build workflow shared across Android, container, and packaging jobs; default T383838pnpm test uses T383838vitest run for the web suite plus T383838vitest.electron.config.js for Electron helpers.
• Docker: Git installed for frontend build steps; corepack replaced with npm-based pnpm install; Python base image refresh (e.g. 3.14-series Alpine), venv runtime tools, pip/setuptools updates; T383838g++ in build deps for miniaudio compile paths; T383838.dockerignore / T383838.gitignore tweaks; workflow git clone/fetch handling for reproducible image builds; T383838README.md included in the Dockerfile copy context; container entrypoint path updated; ffmpeg removed from Alpine package lists now that audio encoding is in-process.
• Electron / Linux: AppImage pipeline builds x64 and arm64 artifacts; Electron Forge adds optional Snap and Flatpak makers (see T383838forge.config.js and local packaging scripts); Flatpak 25.08 runtime/base alignment, Flathub remote bootstrap script, and packaging script tweaks; Snap core22 base prep and multi-snap install for destructive-mode builds; Forge temp-dir helper for packaging; T383838resetAdHocDarwinSignature on Darwin; platform-specific resource handling fix in the Electron packager path.
• Desktop build scripts: macOS and Windows scripts can consume prebuilt frontend output when present to shorten release builds.
• Android CI: Workflow runs Node.js setup and frontend build before APK packaging so Web assets stay in sync with the app bundle; slim/full flavor alignment with bundled repository wheels where applicable; NDK / sdkmanager steps tolerate preinstalled SDK tooling; Taskfile gains flavour/ABI/l10n-test polish and cleanup steps.
• Docs: Raspberry Pi install guide expanded with automated setup scripts and service-oriented instructions; root README and translated install docs note Poetry 2.3.4 and pnpm v10+ lifecycle behaviour; README APK section calls out slim vs full / ABI packaging; NomadNet browser and Mesh Server page documentation added.
• Container / compose: T383838docker-compose.yml and related Docker notes updated; optional T383838Dockerfile.extra for layered builds where documented.
Security
• Android WebView: T383838MainActivity T383838WebViewClient.shouldOverrideUrlLoading blocks top-level navigations except T383838http/T383838https to loopback hosts (T383838127.0.0.1, T383838localhost, T383838::1 / T383838[::1]), plus T383838about:blank, T383838blob:, and T383838data:, so external clearnet URLs cannot be opened inside the embedded browser.
• Electron shell paths: T383838showPathInFolder and T383838openPath IPC handlers validate paths against allowed roots (default storage, Reticulum config, T383838userData, temp, downloads, documents, portable bundle dir when set, and T383838--storage-dir / T383838--reticulum-config-dir from argv) via T383838electron/shellPathGuard.js; out-of-tree paths are rejected.
• LibreTranslate / SSRF: Client-supplied T383838libretranslate_url (languages query and translate JSON) must target loopback only (T383838http_url_guard.normalize_loopback_http_service_base); server default T383838LIBRETRANSLATE_URL is unchanged. Outbound LibreTranslate T383838aiohttp calls use T383838allow_redirects=False. Invalid URLs return HTTP 400 from the translator API routes.
• CSP: Removed T383838'unsafe-eval' from default script policy; main SPA responses use T383838script-src 'self' only, while T383838/rnode-flasher/ and T383838/reticulum-docs/ keep T383838'unsafe-inline' for their inline scripts. Service worker registration moved from T383838index.html into T383838main.js so the shell does not rely on an inline script tag. Electron session fallback CSP drops T383838'unsafe-eval' as well.
• Electron external URLs: T383838electron/safeExternalUrl.js T383838normalizeExternalUrlForOpen gates T383838shell.openExternal in T383838electron/main.js (T383838setWindowOpenHandler fallback and context-menu Open link) and T383838electron/main-legacy.js, allowing only T383838http:, T383838https:, and T383838mailto:; T383838javascript:, T383838data:, T383838file:, and other schemes are dropped. T383838tests/electron/safeExternalUrl.test.js adds regression and light fuzz coverage.
• Chat link rendering: T383838meshchatx/src/frontend/js/LinkUtils.js T383838renderStandardLinks validates detected URLs with the T383838URL constructor (with an T383838& → T383838& retry for HTML-escaped query strings), omits linkification when parsing fails or the scheme is not T383838http/T383838https, excludes T383838' and T383838" from the autolink detector tail, HTML-escapes link labels, and HTML-escapes T383838data-nomadnet-url attribute values. T383838tests/frontend/LinkUtils.test.js / T383838MarkdownRenderer.test.js updated for canonical T383838href output.
• Tests: T383838tests/backend/test_http_url_guard.py (loopback URL edge cases and rejections), T383838tests/electron/shellPathGuard.test.js, and T383838tests/electron/safeExternalUrl.test.js cover URL and path rules.
• Repository uploads: T383838tests/backend/test_repository_server_manager.py parametrized rejects for T383838save_upload filenames outside T383838_safe_any_upload_filename (T383838repository_server_manager.py).
• Map deep links and map ping classification: T383838meshchatx/src/frontend/js/mapLinkUtils.js T383838mapLinkKindFromMessage now requires the localized MeshChatX map ping prefix at the start of the message (after optional whitespace) with a word boundary, so a ping cannot be spoofed by embedding that phrase inside HTML or other text. Backend coverage in T383838tests/backend/test_deep_links_security.py for T383838lxm.ingest_uri T383838meshchatx://map / T383838meshchat://map (including XSS-shaped T383838layers / T383838label query values and Hypothesis fuzzing); frontend coverage in T383838tests/frontend/mapLinkUtils.security.test.js, T383838tests/frontend/deepLinks.protocol.security.test.js, and updates to T383838tests/frontend/mapLinkUtils.test.js.
• Interface discovery numerics: T383838meshchatx/src/frontend/js/interfaceDiscoveryUtils.js T383838numOrNull only accepts T383838string and T383838number (no T383838Number([]), T383838Number({ valueOf }), or other object coercion). T383838tests/frontend/interfaceDiscoveryUtils.security.test.js and T383838tests/frontend/interfaceDiscoveryUtils.test.js cover edge cases.
• Discovered interface list payloads (backend): T383838tests/backend/test_discovered_interfaces_security.py fuzzes T383838ReticulumMeshChat.discovery_filter_candidates, T383838matches_discovery_pattern, T383838sanitize_discovery_patterns, and T383838filter_discovered_interfaces with very long names, HTML/script-like strings, and arbitrary extra keys, and asserts T383838json.dumps on filtered results.
• Stickers, GIFs, and LXMF reactions (backend + frontend): T383838tests/backend/test_media_sticker_reaction_gif_security.py Hypothesis-fuzzes T383838meshchatx/src/backend/sticker_utils.py (T383838sanitize_sticker_name, T383838sanitize_sticker_emoji, T383838normalize_image_type), T383838gif_utils (T383838sanitize_gif_name, T383838normalize_image_type, T383838validate_gif_payload / export documents), T383838sticker_pack_utils pack string sanitizers, and T383838lxmf_utils.convert_lxmf_message_to_dict with hostile T383838app_extensions reaction fields. T383838tests/frontend/lxmfReactions.test.js and T383838tests/frontend/inViewObserver.test.js add reaction-merge and raster-type edge cases.
Testing and docs
• Frontend: T383838AppPropagationSync.test.js covers immediate completion (no stray loading toast), polling with T383838path_requested and live T383838ToastUtils.loading, and T383838no_path end states with translated error text; T383838AppModals / T383838ChangelogModal tests updated where changelog content or expectations shifted.
• Frontend (incoming delivery limit): T383838tests/frontend/incomingDeliveryLimit.test.js for clamp and preset/custom byte mapping; T383838SettingsPage.config-persistence.test.js covers preset T383838PATCH and debounced custom save.
• Backend (config API): T383838test_auto_propagation_api.py asserts delivery limit T383838PATCH clamps above 1 GiB to 1 GiB and applies T383838delivery_per_transfer_limit on the router.
• Frontend (modularization): Shared T383838tests/frontend/fixtures/settingsPageTestApi.js for T383838buildFullServerConfig / T383838window.api mocks; unit tests for T383838settingsConfigService and T383838conversationMessageHelpers; T383838SettingsSectionBlock stubbed in settings-related tests; overlapping IconButton cases removed from T383838UIComponents.test.js (covered by T383838IconButton.test.js).
• E2E: Keyboard shortcut and conversation scrolling coverage; navigation assertions aligned with current marketing copy; onboarding tooltip dismissal hooks where applicable.
• Integration: Loopback TCP test fixture used by relevant integration tests.
• Backend: T383838test_lxmf_propagation_full.py adds T383838path_timeout in status mapping, T383838test_convert_propagation_node_state_maps_all_lxmf_transfer_states for LXMF propagation transfer constants, and Hypothesis T383838path_timeout in allowed propagation state strings; T383838test_app_status_tracking expects T383838changelog_seen_version 4.5.0 in app status tests; stamp validation test hardened against flaky random workblocks.
• Bots / propagation / licenses: Expanded tests for bot sidecar behaviour, propagation node UI/state, and license rendering collectors.
• GIFs and stickers: Backend tests T383838test_gif_utils, T383838test_gifs_dao, T383838test_sticker_pack_utils, T383838test_sticker_packs_dao; frontend T383838Gifs.test.js, T383838StickerView.test.js, T383838InViewAnimatedImg.test.js, T383838tgsDecode.test.js, T383838inViewObserver.test.js, T383838mediaLottieStickerGifs.fuzzing.test.js.
• Reticulum config editor: T383838test_reticulum_config_editor.py (backend), T383838ReticulumConfigEditorPage.test.js (frontend).
• Interfaces: T383838test_interface_discovery_ifac.py, T383838InterfacesDiscoveryIfac.test.js.
• Interfaces (port-in-use and full options): T383838tests/backend/test_interface_port_check.py covers the new socket probe (free port, busy TCP port, busy UDP port, invalid input, wildcard host, unresolvable host, conflict-message formatting). T383838tests/backend/test_interface_options.py drives T383838/api/v1/reticulum/interfaces/add for AutoInterface (full options + invalid T383838discovery_scope/T383838multicast_address_type + busy T383838data_port returning 409), TCPClient (advanced options), TCPServer (optional options + busy listen-port 409), UDP (busy listen-port 409), BackboneInterface (listener-mode persistence + connector mode still requiring remote), RNode (flow control / ID callsign / airtime limits), KISS (full serial + framing + beacon options), AX.25 KISS (callsign/SSID), and I2P (T383838connectable=False). T383838tests/frontend/AddInterfaceOptions.test.js asserts each new field is sent through T383838window.api.post('/api/v1/reticulum/interfaces/add', ...) and that backend HTTP 409 "port already in use" responses are surfaced via T383838ToastUtils.error.
• Messaging: T383838test_message_sending_failures.py, T383838MessageSendingFailures.test.js; T383838CJKTextOverflow.test.js for composer/thread overflow.
• Media API: T383838test_media_http_api.py, T383838test_media_fuzzing.py, shared T383838media_test_assets.py fixtures.
• AutoInterface guidance: T383838tests/backend/test_user_guidance_autointerface.py exercises bind-failure detection and user-facing guidance strings.
• Translator: Integration tests for Argos-based forwarding after CLI detection refactor, including network checks for Stanza resource fetching.
• LXMF sieve: T383838test_lxmf_sieve.py and T383838test_lxmf_sieve_fuzz.py.
• Repository server: T383838test_repository_server_manager.py.
• Map / audio (frontend): Additional Vitest coverage for map components, geodesy utilities, and audio handling paths.
• Electron: Vitest Electron config plus loading/main helper coverage for the desktop shell.
• CI stability: Peering-key rejection integration test avoids flaky peer selection.
[4.4.0] - 2026-04-15
TL;DR
• Chatting: Pin important conversations, keep draft text when you switch chats (without them disappearing randomly), see clearer send status, paste images straight into the message box, and send one message at a time in order (outbound queue). Deleting a conversation also clears its read state, folder placement, and pins.
• Reactions: Emoji reactions over LXMF are finally here! (field 16: target message hash, emoji, sender identity hash); send from the message context menu (fixed picker); reactions render below the bubble, outside it, bottom-right; hover shows who reacted (you, the open peer, or a known conversation name).
• Emoji and stickers: One place in the composer opens emojis or your own sticker images (per identity); you can import/export sticker libraries in settings, add images by drag-and-drop or upload, and save an image from a message into stickers when it makes sense.
• Nomad Network browsing: Besides Micron pages, the built-in browser can show Markdown, plain text, and simple web-style pages; you can tune what gets rendered, pick a default page when a node has no path, and links are handled more safely so the app stays on the mesh (not opening clearnet or risky URLs). Loading shows clearer phase text and file size; announces and favourites have richer context menus (rename, banish, lift, sections). Sidebars can collapse on medium-and-up screens with quick previews of recent chats and favourites.
• Map: You can pop out the map in a separate window now.
• Look and layout: Cleaner, more consistent light and dark appearance; Tools is a single list with refreshed pages (Bots, paper message, RN path tools, RNode flasher, About, Interface, Settings, Contacts, App); third-party licenses sit under About with an API-backed list.
• Network noise: Caps on how many announces are fetched, searched, and shown per aspect (configurable in settings) so busy meshes stay usable.
• Security and troubleshooting: Stricter limits on failed logins from untrusted devices when auth enabled (since there are some exposed meshchatx instances out there); optional screens on debug tool to inspect login attempts and search or filter logs.
• Working with other mesh apps: Voice messages use a format that tends to play better elsewhere; outgoing messages can tell other clients to treat text as Markdown; messages to saved contacts can include a stamp ticket so they can reply without extra proof-of-work; file transfers and path tools expose clearer status, stop controls, and filters (including max hops and path table by destination).
• Blocked peers: Lift a banishment from the conversation header or sidebar when you want to hear from someone again.
• Notifications: Refined unread handling (finally no more getting tricked with fake notifications, hopefully) and a toggle for bell history.
• Checking reachability: Ping destination shows a clear working state while the request runs.
• Archives: Export saved snapshots as Micron (T383838.mu) files; multi-export avoids filename clashes.
• Large Nomad Micron pages: Smoother scrolling and resizing on big T383838.mu pages (including a faster path for ordinary Latin/Cyrillic monospace text).
• Network visualizer: Toolbar, legend, and loading state are clearer; path table and graph behaviour use shared helpers for trails, bounds, and layout constants.
• Connections: The app WebSocket client heartbeats, reconnects, and handles ping/pong more predictably when the link drops or stalls.
• Theming: Semantic design tokens feed Tailwind and Vuetify so light/dark surfaces and accents stay aligned across pages.
• Desktop app (Electron): Right-click menus in text fields (cut/copy/paste, spellcheck, add to dictionary), sensible behaviour for links, and file/folder pickers wired through the desktop shell where applicable.
Platform and backend
• Split T383838meshchat.py startup into T383838path_utils, T383838ssl_self_signed, and T383838env_utils (re-exported from T383838meshchat.py for compatibility).
• HTTP: T383838docs_manager, T383838map_manager, and T383838translator_handler use T383838aiohttp; T383838requests removed. Stricter request validation and clearer API errors; T383838tests/backend/fixtures/http_api_routes.json kept in sync.
• CLI: Prefer T383838meshchatx (T383838python -m meshchatx.meshchat, Docker, Make, Taskfile); T383838meshchat remains an alias. T383838--rns-log-level / T383838MESHCHAT_RNS_LOG_LEVEL; optional T383838--ssl-cert / T383838--ssl-key (both required if used).
• Auth (schema 42): T383838access_attempts, T383838trusted_login_clients, rate limits and lockout for untrusted clients, T383838GET /api/v1/debug/access-attempts. T383838DELETE conversation clears read state, folder mapping, and pins.
• AsyncUtils: thread-safe scheduling; pending coroutines flushed when the main event loop is set.
• NomadNet downloader: thread-safe link cache, T383838get_cached_active_link, phased WebSocket progress, faster polling, safer UTF-8 and cancel handling.
• RNCP (file transfer): receive-completed handling and error reporting; transfer start callbacks; status / stop API and websocket broadcast; listener destination setup/teardown and tests.
• RNPath / RNStatus: interface discovery; optional geo fields on interfaces. Network visualizer: T383838lxmf.delivery / T383838nomadnetwork.node only; T383838POST /api/v1/path-table filters by destination hashes; max hops filter in the UI; refactored trail/bounds utilities and constants for the graph view.
• Licenses: collector for Python and Node dependencies; T383838GET /api/v1/licenses; T383838licenses_frontend.json included in package data.
• CI / packaging: Gitea shell-based jobs, optional SLSA v1 cosign attestations; GitHub Actions for Windows/macOS; T383838priv.sh / T383838exec-priv.sh; macOS universal build avoids duplicate T383838backend-manifest.json; stripped Python bytecode in backend bundle.
• CI: Node dependency scanning uses Trivy (T383838scripts/ci/trivy-fs-scan.sh) instead of pnpm audit, after npm retired the legacy registry audit API used by pnpm.
• Container: non-root T383838meshchat; T383838HEALTHCHECK on T383838/api/v1/status (TLS verify relaxed for default self-signed). Podman/OCI: no Docker-style T383838HEALTHCHECK unless T383838--format docker; T383838/config bind mounts may need uid alignment.
• Debug Logs: Logs and Access attempts tabs (search, filters, pagination).
• T383838scripts/ci/setup-python.sh: Sigstore verification and cosign download by architecture.
• Stickers: per-identity image library (schema, validation, DAO), T383838/api/v1/stickers CRUD and T383838GET …/image, settings import/export, T383838DELETE /api/v1/maintenance/stickers; T383838tests/backend/fixtures/http_api_routes.json updated when routes change.
• Community packaging (T383838cx_setup.py): Optional T383838lxmfy and T383838websockets dependencies; T383838scripts/build_community_interfaces_json.py, T383838scripts/move_wheels.py, and T383838scripts/ci/slsa-predicate.py refinements for clearer outputs and metadata.
Frontend and UX
• Vite 8, T383838@vitejs/plugin-vue 6, Rolldown-oriented chunking; T383838fetch via T383838apiClient.js instead of axios.
• Announce limits: per-aspect cap with trim; configurable fetch/search/discovered caps; settings and locales.
• Conversations: serial outbound send queue; optional detailed outbound status (settings + i18n); conversation pins; Lift banishment from viewer/sidebar; clipboard image paste into compose; fix for empty thread when switching chats while a fetch is in flight; compose drafts persisted in T383838localStorage (including on unmount); responsive ConversationViewer and dropdown actions.
• Conversation ping: Ping Destination shows a loading toast while the request runs; T383838ToastUtils.dismiss(key) and a T383838toast-dismiss event remove keyed toasts (e.g. dismiss after fetch).
• Emoji and stickers (composer): single emoticon control at the end of the message field opens a tabbed popup (Emojis | Stickers). Emojis use T383838emoji-picker-element with T383838emoji-picker-element-data bundled via Vite (T383838?url) so emoji metadata loads same-origin and satisfies strict CSP with no reliance on any CDNs. Stickers tab: library grid, drag/drop and file upload, save image to stickers from the message menu where applicable.
• Notifications: bell history toggle; refined unread handling.
• NomadNet: phase-based loading copy; duration/size in header; context menus on announces/favourites (rename, banish, lift, sections); collapsible Messages and Nomad list sidebars on sm+ (chevron); when collapsed, Messages shows tab icons plus up to five conversation avatars (Conversations tab, pinned/recent order) and no extra strip on Announces; Nomad collapsed rail shows up to five favourites (section order) on Favourites and up to five nodes (latest announce order) on Announces.
• NomadNet browser page formats: In addition to Micron (T383838.mu), the built-in browser renders Markdown (T383838.md), plain text (T383838.txt), and static HTML with CSS (T383838.html). Markdown uses CommonMark-style headings (a space after T383838# is required unless the viewer normalizes shorthand); HTML is sanitized (no script, no external URLs in CSS, no off-mesh links in T383838href/T383838src except safe patterns). Mesh servers register the same extensions under T383838/page/; unknown extensions are rejected by the API.
• NomadNet browser renderer settings: Settings include a NomadNet browser renderer section (under Browsing): toggles to disable extra rendering for Markdown, HTML, and plain text (Micron is always rendered); default page path when opening a node without a path (T383838/page/index.mu, T383838/page/index.html, T383838/page/index.md, or T383838/page/index.txt), also used for hash-only Nomad links and the Smart Crawler homepage fetch.
• NomadNet link isolation and Reticulum-only navigation: Relative and mesh-style links in HTML, Markdown, and Micron output are rewritten to T383838href="#" with T383838data-nomadnet-url so the SPA does not navigate the browser to T383838/page/... or off-app URLs. The Nomad browser and Archives viewer handle T383838.nomadnet-link clicks in-app; in-page T383838#fragment links scroll within the viewer. T383838href sanitization explicitly rejects http, https, protocol-relative T383838//, mailto, ftp, file, data, javascript, and similar schemes so clearnet and dangerous URLs are not preserved as navigable links.
• Tools: Removed the duplicate Third-party licenses entry from the Tools grid (licenses remain under About).
• Shell chrome: Opaque white / dark zinc-950 surfaces aligned across the top bar, navigation drawer, Messages/Nomad sidebars, conversation header, message list, and composer (replacing mixed translucent, backdrop-blur, and gradient backgrounds for consistent light/dark appearance).
• Theme (T383838designTokens.js): Semantic tokens integrated with Tailwind (T383838tailwind.config.js) and Vuetify theme overrides; optional theme-variable injection for integrators using T383838cx_setup.
• Network visualiser (UI): Dedicated toolbar, legend, and loading overlay components; internal modules for trail placement, view bounds, and shared constants (cleaner layout and future work).
• NomadNetwork: Separate AbortController instances for the node list and node detail fetches so navigation cancels the right request.
• WebSocket (T383838WebSocketConnection.js): Heartbeat, backoff/reconnect, and ping/pong handling with shared helpers in T383838wsConnectionSupport.js.
• Context menus (Vue): Shared ContextMenuPanel, ContextMenuItem, ContextMenuDivider, and ContextMenuSectionLabel (T383838components/contextmenu/); styling tokens in T383838style.css. Wired into Contacts, Messages sidebar, ConversationViewer message menu, NomadNetwork sidebar (favourites, sections, announces), and Map (optional header slot for the title row).
• LXMF emoji reactions (UI): React section in the message context menu (Columba-aligned emoji set); inbound/outbound websocket paths merge reactions onto the target message instead of a separate row; T383838mergeLxmfReactionRowsIntoMessages when loading history; chips below the bubble with T383838title tooltips via T383838reactionReactorLabel (self, selected peer, sidebar conversations, else short hash).
• Vue lint: T383838vue/no-reserved-keys: internal T383838data() fields renamed (peer header ResizeObserver, Nomad Micron partial scheduling requestAnimationFrame handle) so ESLint passes without reserved T383838_ prefixes.
• Map: pop-out window.
• Tools: list-style ToolsPage; refreshed Bots, Paper message, RN path, RN path trace, RNode flasher; About, Interface, Settings, Contacts, App polish (loading overlays, display names, license links). Many tool and settings pages use adjusted backgrounds and padding for alignment with the global shell.
• Electron: default context menu for editable fields (cut/copy/paste, spellcheck suggestions, add to dictionary), links, and related actions; pick file / pick directory / open path / notifications and related preload helpers; loading screen refresh; CSP and backend HTTP-only IPC where applicable.
• T383838/robots.txt in T383838public/; T383838SECURITY.md crawler note.
• Locales: T383838import.meta.glob discovery; new strings for outbound status, archives, NomadNet, RNCP (including browse/folder/web hints), max hops, stickers, emoji picker tabs, message reactions (react / you / send failed), and backend connection status copy in en / de / it / ru, etc.
Micron and archives
• MicronParser: fault-tolerant line and document fallbacks; safer monospace and sanitization; monospace fast path for Latin and Cyrillic (and other non-CJK text) using grouped spans instead of one DOM node per character when the line does not need CJK or box-drawing cell alignment, improving scroll and resize performance on large .mu pages.
• NomadNet Micron viewer: T383838v-memo on the rendered page HTML, T383838contain: layout paint on the scroll container, and early exit in partial processing when the page source has no partial placeholders; Messages and Nomad sidebars use T383838matchMedia(min-width: 640px) instead of T383838window.resize so the sm breakpoint updates only when crossing the threshold (smoother responsive / DevTools resizing).
• Archives: export snapshots as T383838.mu (multi-export avoids name collisions).
Removed
• axios (replaced by T383838fetch), legacy PR vulnerability workflow, Nix flakes, obsolete scripts.
• LegacyMigrator: Removed legacy database migration system from startup to streamline initialization.
LXMF interoperability
• Markdown renderer field: Outbound messages now set T383838FIELD_RENDERER to T383838RENDERER_MARKDOWN, so receiving clients (Sideband, etc.) know to render content as Markdown.
• Stamp tickets for contacts: Outbound messages to saved contacts automatically include a T383838FIELD_TICKET (T383838include_ticket), allowing trusted peers to reply without generating a proof-of-work stamp.
• Opus voice messages: Browser-recorded Opus audio (WebM container) is converted to OGG/Opus via ffmpeg before sending, fixing playback on Sideband and reducing file size (~24 kbps VBR).
• Emoji reactions (Columba-compatible): Reactions are separate LXMF messages with empty body and field 16 (T383838reaction_to message hash, T383838emoji, T383838sender as hex identity hash), opportunistic delivery, no markdown renderer / ticket / icon field on reaction-only sends. T383838POST /api/v1/lxmf-messages/reactions; T383838send_reaction / T383838app_extensions on T383838send_message; T383838lxmf_fields_are_columba_reaction for delivery (spam keywords skipped for reaction frames; title/content decoded safely); alias forwarding passes field 16 through. T383838convert_lxmf_message_to_dict / T383838convert_db_lxmf_message_to_dict expose T383838is_reaction, T383838reaction_to, T383838reaction_emoji, T383838reaction_sender, and T383838fields.app_extensions (field 16 with T383838reply_to stays a normal message, not a reaction).
Testing and docs
• Frontend: Vitest expanded for ConversationViewer (outbound bubble styling, clipboard images vs non-images, paste toolbar, file attachments, translation, conversation fetch ordering, compose drafts, stickers / emoji picker); Toast (T383838toast-dismiss); RNCP handler listener/status tests; HTTP route contract (T383838tests/backend/fixtures/http_api_routes.json); T383838tests/frontend/setup.js: T383838fake-indexeddb, T383838fetch stub for bundled emoji JSON; console noise suppressed in CI; MicronParser tests for Cyrillic/CJK monospace paths; NomadNetwork sidebar/page tests aligned with collapse and Micron behavior; i18n parity for RNCP keys (de / it / ru); SettingsPage visibility test updated for three message bubble color pickers; T383838contextMenuStyles.test.js asserts shared CSS classes and ContextMenu component usage across pages (sidebar/button tests updated for T383838.context-menu-panel selectors); T383838lxmfReactions.test.js for T383838mergeLxmfReactionRowsIntoMessages (merge + dedupe); WebSocket unit tests for connection helpers. Load-time / large-list sidebar tests (T383838tests/frontend/LoadTimePerformance.test.js) are not run in default T383838pnpm test or CI; run T383838pnpm run test:loadtime or T383838task test:fe:loadtime locally when you need that check.
• Backend: access attempts, announce limits, downloader, Micron, SSL CLI, memory-leak regressions (message state updates, etc.), sticker utils/DAO/API tests, fuzzing where applicable; WebM-to-OGG conversion unit tests; T383838test_lxmf_reactions.py (field 16 reaction shape, DB round-trip, T383838reply_to in app extensions without treating as reaction); incoming-call policy tests (DND, contacts-only, blocking); conversation and announce search integration tests; JSON API response schema/contract coverage on selected handlers.
• E2E: Playwright (T383838tests/e2e/, T383838pnpm run test:e2e) smoke, navigation, shell chrome.
• Docs: README / T383838docs/meshchatx.md and T383838docs/nomadmesh_pages.md (Nomad/Mesh Server page formats); README section Linux desktop: emoji fonts (e.g. T383838noto-fonts-emoji on Arch/Artix, Debian/Fedora equivalents) when glyphs show as tofu. Dependency bumps via pnpm / Poetry (Electron, Vue, Vuetify, Playwright, emoji-picker-element, emoji-picker-element-data, fake-indexeddb, cryptography 46.0.7, hypothesis, pytest, ruff, rns 1.1.5, Python 3.14 in CI, etc.).
[4.3.1] - 2026-03-10
Fixes
• Message retry: Added per-message retry button to the context menu and inline on failed/cancelled outbound messages, allowing individual message resend without bulk retry.
• Sender display name: Fixed outgoing messages showing "Unknown Peer" by resolving display names from conversations and announces when composing to a new peer.
• Conversation refresh on send: Added T383838lxmf_message_created and T383838lxmf_message_state_updated websocket handlers to T383838MessagesPage so the sidebar updates after sending without requiring an incoming message to trigger a refresh.
• No-flash sidebar updates: Outbound message state transitions (outbound, sending, sent, delivered) now update the sidebar in-place without API calls. New messages trigger a background merge that patches existing conversation objects rather than replacing the array, preventing full sidebar re-renders.
• Received message outbound flag: Incoming messages now explicitly set T383838is_outbound: false instead of relying on an undefined default.
Testing
• Frontend: New tests for message retry context menu visibility, retry click behavior, T383838is_outbound on received messages, in-place conversation updates on send, display name merge from API, failed message count tracking, and zero API calls during state transitions.
• Backend: New tests for T383838MessageHandler covering T383838failed_count in conversations, T383838filter_failed query, T383838search_messages, and T383838after_id/T383838before_id pagination.
[4.3.0] - 2026-03-09
New Features
• Mesh Server: Serve Micron pages and files directly over Reticulum. Each server gets its own RNS identity and destination address with the T383838nomadnetwork.node aspect, making it compatible with the standard NomadNet page browsing protocol. Supports dynamic per-page and per-file request handler registration, announce broadcasting, and full lifecycle management (create, start, stop, delete, rename).
• Mesh Server management UI: New tool page for creating and managing Mesh Servers with start/stop controls, announce button, page CRUD (add, edit, delete), file upload/delete, and a "View" button that opens the server's content in the built-in NomadNet browser.
• Micron Editor publish integration: "Publish to Mesh Server" button in the Micron Editor allows publishing the current tab or all tabs directly to a selected Mesh Server.
• Local page serving: Pages and files hosted on local Mesh Servers are served directly from disk when browsed locally, bypassing RNS link establishment. This provides instant page loads for your own content.
• Local announce injection: Mesh Server announces are injected directly into the MeshChat announce database on startup, node start, and manual announce, ensuring they appear in the NomadNet announces list without depending on RNS loopback processing.
• Stranger protection: Settings to block attachments and messages from non-contacts. Message handling strips attachments from strangers when configured; database schema extended to track stripped attachments. Localization and UI for stranger protection options.
Improvements
• NomadNet downloader: Added identity recall validation before link establishment to provide clearer error messages when a destination identity cannot be resolved.
• NomadNet partials: Fixed partial page loading when partials include field data; PARTIALLINEREGEX captures optional fields, WebSocket allows partial responses when callback registered, partial DOM updates via innerHTML. Auto-refresh behavior improved.
• PageNodesPage: Refactored error handling.
• MessagesSidebar: Time-ago functionality for message timestamps.
• InterfacesPage: Removed bounce and disconnected animation logic and related properties.
• Status indication: Removed redundant status indication from UI.
Testing
• Mesh Server tests: 66 new tests covering PageNode (setup, teardown, announce, page/file CRUD, responder closures, config persistence, status, link callbacks, path traversal protection, edge cases) and PageNodeManager (create, delete, start/stop, announce, rename, get/list, disk persistence, teardown).
• Notification and LXMF: Extensive tests for notification reliability and LXMF field hardening.
• Frontend: Comprehensive tests for MicronParser and NotificationBell.
• Performance: Updated performance tests and expectations for rendering times.
Developer / Docs
• CONTRIBUTING and CONTRIBUTORS added for contribution guidelines and credits.
• Makefile added for common build/run targets.
• README updates.
[4.2.1] - 2026-03-06
New Features
• DOMPurify for NomadNet: Added T383838dompurify dependency and global T383838DOMPurify in frontend entry so MicronParser sanitizes content when browsing Nomad Network nodes; removes "DOMPurify is not installed" warning in AppImage and packaged builds.
• Identities page: Import and Export all identities in header (next to New Identity). Per-identity key actions: export key file and copy Base32 shown on hover for the current identity card only. Import modal with upload key file and paste Base32. Backend T383838GET /api/v1/identities/export-all returns a ZIP of all identity key files.
• Contacts page: Contacts management UI with routing, localization (en, de, it, ru), and LXMA contact handling. Public key retrieval and tests for LXMA URI handling.
Security
• SQL injection hardening: All raw SQL queries audited and confirmed parameterized. Added T383838_validate_identifier() for dynamic table/column names in schema migrations. Legacy migrator T383838ATTACH DATABASE path properly escaped; column names from untrusted legacy DBs filtered with regex whitelist.
Diagnostics
• Adaptive Diagnostics Engine: Crash recovery upgraded from static heuristics to a lightweight adaptive system that learns from crash history.
• Crash history persistence: New T383838crash_history table (migration 40) stores crash events with error type, diagnosed cause, symptoms (JSON), probability, entropy, and divergence. Capped at 200 entries.
• Bayesian weight learning: Root-cause probabilities refined over time using a conjugate Beta-Binomial model. After 3+ crashes, learned priors replace hardcoded defaults and are persisted in config. Weights clamped to [0.01, 0.99] to prevent degenerate priors.
• Log entropy: Shannon entropy computed over log-level distribution in a 60-second sliding window from in-memory deques (zero DB queries). Error rate tracking exposed as T383838current_error_rate property.
• Predictive health monitor: New T383838HealthMonitor daemon thread checks every 5 minutes for entropy climbing (3 consecutive rising readings above threshold), elevated error rate, and low available memory. Warnings broadcast via WebSocket. No DB queries in the monitor loop.
• Integrity & crash recovery hardening: Fixed T383838platform.release() regex safety in legacy kernel detection. Fixed T383838IntegrityManager path handling when database is outside storage directory. Added latitude clamping in map tile calculations to prevent division by zero at geographic poles.
Performance
• Database indexes: Added 8 new indexes in schema migration 39 covering contacts JOIN columns (T383838lxmf_address, T383838lxst_address), notification filters (T383838is_viewed), map drawings (T383838identity_hash), voicemails (T383838is_read), archived pages (T383838created_at), and a composite index on T383838lxmf_messages(state, peer_hash) for the failed-count subquery.
• SQLite PRAGMAs at startup: T383838journal_mode=WAL, T383838synchronous=NORMAL, T383838cache_size=8MB, T383838mmap_size=64MB, T383838temp_store=MEMORY, T383838busy_timeout=5s applied on every database initialization.
• Bounded queries: T383838search_messages(), T383838get_conversations(), and T383838get_filtered_announces() now enforce default LIMIT (500) to prevent unbounded result sets. T383838get_all_lxmf_messages() paginated (5000 per page); export endpoint iterates pages.
• Slim conversation list queries: Conversation list queries (T383838MessageDAO.get_conversations, T383838MessageHandler.get_conversations) now select only the columns needed for the list view, skipping large T383838content and T383838fields blobs.
• Bulk database operations: Batch methods (T383838mark_conversations_as_read, T383838mark_all_notifications_as_viewed, T383838move_conversations_to_folder) converted from per-row T383838execute loops to single T383838executemany calls inside transactions. T383838delete_all_lxmf_messages wrapped in a transaction for atomicity. Added T383838DatabaseProvider.executemany().
Improvements
• Micron editor: Button label changed from "Download" to "Save" on the micron editor page (en: Save; de: Speichern; it: Salva; ru: Сохранить).
• MicronParser: Overlay style stripping and improved event handling in NomadNetworkPage.
• Release workflow: Include T383838meshchatx-frontend.zip in release assets (was generated and checksummed but not uploaded). Add Linux arm64 build step (AppImage + deb) via T383838dist:linux-arm64. Release T383838files list now includes T383838*.zip.
• Community interfaces: Replaced RNS Testnet Amsterdam and BetweenTheBorders with Quad4 hub (62.151.179.77:45657 TCP). Removed outbound health checks: suggested community interfaces are now a static list with no TCP probes to the internet.
• Identities: Removed top key-control card; key actions moved to per-card hover. Message count and LXMF/LXST addresses on identity list; backend message_count for current identity.
• About page: Security & Integrity section: signed (shield-check) icon and "No integrity violations" badge use green styling in dark mode; status pill has dark-mode emerald variants.
• Version management: Single source of truth is T383838package.json; run T383838pnpm run version:sync to update T383838meshchatx/src/version.py. Build runs sync automatically.
Testing
• SQL injection tests: Unit tests for T383838_validate_identifier, integration tests for T383838_ensure_column with malicious identifiers, property-based tests for T383838ATTACH DATABASE path escaping and identifier regex.
• DAO fuzzing: Hypothesis property-based fuzzing across ContactsDAO, ConfigDAO, MiscDAO, TelephoneDAO, VoicemailDAO, DebugLogsDAO, RingtoneDAO, MapDrawingsDAO, MessageDAO folders, MessageHandler search, T383838_safe_href, and utility functions.
• Performance regression benchmarks: Latency (p50/p95/p99) and throughput (ops/sec) benchmarks for announce loading/search, message loading/search/upsert, favourites, and conversation operations. EXPLAIN QUERY PLAN assertions verify index usage. Concurrent read/write contention tests. LIKE search scaling tests across data sizes. Index existence and PRAGMA verification tests.
• Diagnostics tests: CrashHistoryDAO CRUD and cleanup tests. Bayesian weight learning correctness (prior defaults, learned priors, clamping, minimum crash threshold, config persistence). HealthMonitor detection logic (entropy climb, error rate, memory pressure, edge cases). Log entropy math (zero/uniform/single-level distributions, sliding window expiry). Hypothesis property tests for Beta-Binomial posterior bounds.
• Integrity & recovery tests: Corrupt/empty/missing-key manifest handling. Direct hash-file and DB integrity checks. Entropy threshold boundary tests. Database-outside-storage-dir handling. CrashRecovery system entropy edge cases, legacy kernel regex safety, Reticulum diagnosis isolation, and keyboard interrupt passthrough.
[4.2.0] - 2026-03-05
New Features
• Micron partials: Support for partial content in Nomad Network pages; partial handling in NomadNetworkPage with processing/clearing, dynamic page updates, and MicronParser integration. Tests for partial handling, regex matching, content injection, and state management.
• LXMF quoted replies: Full support for T383838reply_quoted_content in message parsing, sending, and rendering; reply flow in ReticulumMeshChat with quoted content in LXMF message construction.
• Reply in messages: Reply functionality for messages in ReticulumMeshChat.
• Discovery filters and quick actions: Added discovery whitelist/blacklist configuration and per-announce quick actions in Recently Heard Announces (three-dots menu) to allowlist or blacklist announces directly from each card.
• Security tooling: Added T383838eslint-plugin-security; T383838pip-audit and T383838pnpm audit steps in CI; ESLint disable comments for regex patterns in MarkdownRenderer, DocsPage, and ConversationViewer where required.
• Vitest UI: Vitest UI support and configuration updates for frontend testing.
• Lint task: Central T383838lint task in Taskfile to run all linters.
• Translations: Added translations for T383838ingest_paper_message in German, English, Italian, and Russian.
• Build and CI: cx_Freeze build dependencies in build-test workflow; Wine environment setup for Windows builds; multi-architecture build support (e.g. arm64 on Linux/Windows).
Improvements
• MicronParser: DOMPurify integration and general improvements; DOMPurify initialization in frontend test setup.
• NetworkVisualiser: Level of Detail (LOD) management and icon cache optimization.
• AudioWaveformPlayer: Adjusted height, improved waveform rendering for dark mode, MutationObserver for responsive updates.
• Interface discovery UX: Discovery settings now include whitelist and blacklist fields in interface pages, and discovered announce overlays now show Blacklisted when matching blacklist patterns.
• ConversationViewer: T383838unknown state for message delivery checks; animation direction control for syncing indicator.
• Interface and MessagesSidebar: Component improvements.
• Propagation sync and markdown: Improved propagation sync and markdown rendering.
• Integrity management: Advanced checks and metadata support; identity manager metadata loading and legacy migrator column handling.
• Database backup and health: Backup data-loss guards: baseline file (message count and total bytes) after each successful backup; detection of suspicious state (e.g. DB was non-empty and now empty, or size collapsed); when suspicious, backups written as T383838backup-SUSPICIOUS-*.zip without overwriting good backups, rotation and baseline update skipped; rotation only applies to normal T383838backup-*.zip. Database health checks at app start and close (integrity plus baseline comparison) with logging; issues exposed as T383838database_health_issues on app and in T383838/api/v1/app/info; toast notification when issues are present; websocket message type T383838database_health_warning for real-time alert. Integrity result handling fixed for provider returning dict rows.
• Vite: API and WebSocket proxy configuration; sourcemaps disabled in build.
• Node and tooling: Node.js engine requirement set to >=24; Node 24 in Raspberry Pi install guide; pnpm 10.32.1; Node and pnpm version updates in Dockerfile and workflows; pip 26.0 in Dockerfile; pip install with T383838--no-cache-dir.
• Dependencies: rns 1.1.3, Vuetify 3.12.1, Electron 39.7.0, autoprefixer 10.4.27, axios 1.13.6, Vue 3.5.29, serialize-javascript; ajv removed in favour of fast-json-stable-stringify and json-schema-traverse; various package and lockfile updates.
• CI: pnpm installation step in CI and test workflows; pnpm cache removed from CI/test workflows; ESLint security rule tuning.
• Docs and legal: README and TODO updates; LICENSE copyright holder updated from Sudo-Ivan to Quad4; Docker arch builder removed.
Testing
• Frontend: Unit tests for multiple frontend components; AppPropagationSync and ConfirmDialog tests; accessibility tests for keyboard navigation and ARIA labels; MicronParser and NomadNetworkPage tests for partial handling.
• Backend: Backend test refactor. Database backup and health: unit tests for backup baseline, suspicious detection, rotation skip, and health checks (open/close, no baseline, baseline suspicious, integrity fail); property-based test for T383838_is_backup_suspicious; mock test that T383838database_health_issues is set on identity context setup when health check returns issues; tests to ensure health checks do not mistrigger (empty baseline, legitimate empty DB, small DB). Added discovery tests for whitelist/blacklist persistence, filtering behavior, and sanitization.
• Security and fuzzing: Extended fuzzing and security tests for messages and NomadNet browser: WebSocket handlers (nomadnet.download.cancel, nomadnet.page.archives.get, nomadnet.page.archive.load/add, nomadnet.file.download, nomadnet.page.download, lxmf.forwarding.rule add/delete/toggle, keyboardshortcuts.set), NomadNet path variable parsing (convertnomadnetstringdatatomap), archived page lookup, and message get/delete by hash (single and bulk). Ensures robustness against malformed or adversarial input from the mesh.
• Discovery fuzzing/security: Added property-based and security fuzzing tests to validate discovery pattern sanitization and robustness of interface filtering under malformed or adversarial inputs.
• HTTPS/WSS side-sniffing: New tests in T383838test_https_wss_side_sniffing.py to verify that when HTTPS is enabled, the server speaks TLS only on the API/WS port; plain HTTP connections receive no plaintext HTTP response so other local apps cannot sniff MeshChatX traffic; WSS over the same port is verified.
• Scan workflow: Trivy integration moved to unified scan.yml; Docker workflow Trivy exit code adjusted for successful builds; ZIP artifact build step removed from Gitea release flow.
[4.1.0] - 2026-01-16
New Features
• Advanced Diagnostic Engine:
• Mathematically grounded crash recovery system using Probabilistic Active Inference, Shannon Entropy, and KL-Divergence.
• Deterministic Manifold Constraints: Actively monitors structural system laws (V1: Version Integrity, V4: Resource Capacity).
• Failure Manifold Mapping: Identifies "Failure Manifolds" across the vertical stack, including RNS identity failures, LXMF storage issues, and interface offline states.
• Intelligent Integrity Monitoring:
• Implemented Shannon Entropy Analysis for critical files and databases to detect non-linear content shifts (e.g., unauthorized encryption or random data injection).
• Integrated SQLite Structural Verification via T383838PRAGMA integrity_check to distinguish between binary hash changes (dirty shutdowns) and actual database corruption.
• Refined ignore logic for volatile LXMF/RNS files to eliminate false positives in tampering detection.
• Added advanced security alerts for content anomalies, signature mismatches, and critical component compromises.
• RNS Auto-Configuration:
• Automatic creation and repair of the Reticulum configuration file (T383838~/.reticulum/config) if it is missing, invalid, or corrupt.
• Expanded Security Pipeline:
• Integrated Trivy for both filesystem (codebase) and container image scanning.
• Consolidated security scans into a unified T383838scan.yml workflow for better visibility.
• Updated container workflows to include fail-fast filesystem checks.
• Network Visualiser Optimization:
• Implemented AbortController support to cancel pending API requests on component unmount.
• Added high-performance batch fetching for path tables and announces (up to 1000 items per request).
• Announce Pagination:
• Added backend and database-level pagination for announces to improve UI responsiveness in large networks.
• Improved Installation:
• Added support and documentation for installing via Pre-built Wheels (.whl) from releases, which bundle the built frontend for a simpler setup experience.
Improvements
• Reliability & Memory Management:
• Fixed a major concurrency issue where in-memory SQLite databases (T383838:memory:) were not shared across background threads, causing "no such table" errors.
• Resolved T383838asyncio event loop race conditions in T383838WebAudioBridge using a lazy-loading loop property with fallback.
• Refactored T383838IdentityContext teardown to ensure all managers are properly nullified and callbacks cleared, preventing memory leaks and reference cycles.
• Added client list cleanup in T383838WebAudioBridge when calls end.
• UI/UX:
• Enhanced LXMF link handling with better rendering logic for T383838lxmf:// and T383838rns:// URIs.
• Fixed a critical hang in the Startup Wizard where "Finish" or "Skip" buttons could become unresponsive.
• Improved UI navigation safety by automatically closing the tutorial modal when navigating away.
• Refined T383838MarkdownRenderer regex patterns to prevent empty bold/italic tags and improved matching for single delimiters.
• Infrastructure & CI:
• Added dedicated build scripts for Arch Linux packaging to handle permissions and T383838makepkg execution.
• Updated Docker dev-image workflows to trigger on master branch pushes.
• Refactored telemetry data packing for more efficient location transmission.
• Updated dependencies including Electron Forge (7.11.1), Prettier (3.8.0), and ESLint plugins for better stability and formatting.
• Testing:
• Frontend UI Test Suite Expansion: Added comprehensive Vitest suites for all diagnostic and utility tools (Ping, Trace, Probe, RNode Flasher, Micron Editor, etc.).
• Property-Based Testing: Significant expansion with T383838hypothesis to ensure robustness of the diagnostic engine, identity restoration, and markdown renderer.
• Integrity Validation Suite: Added extensive property-based tests for entropy mathematical bounds and simulated corruption scenarios (SQLite b-tree breakage, content type shifts).
• Added automated verification for Python version and legacy kernel compatibility diagnostics.
• Configured temporary log directory management for tests to improve portability.
[4.0.0] - 2026-01-03
Season 1 Episode 1 - A MASSIVE REFACTOR
New Features
• Banishment System (formerly Blocked):
• Renamed all instances of "Blocked" to "Banished", you can now banish really annoying people to the shadow realm.
• Blackhole Integration: Automatically blackholes identities at the RNS transport layer when they are banished in MeshChatX. This prevents their traffic from being relayed through your node and publishes the update to your interfaces (trusted interfaces will pull and enforce the banishment).
• Integrated RNS 1.1.0 Blackhole to display publishing status, sources, and current blackhole counts in the RNStatus page.
• RNPath Management Tool: New UI tool to manage the Reticulum path table, monitor announce rates (with rate-limit detection), and perform manual path requests or purges directly from the app.
• Maps: You can now draw and doodle directly on the map to mark locations or plan routes.
• Calls & Audio:
• Added support for custom ringtones and a brand-new ringtone editor.
• New Audio Waveform Visualization for voice messages, providing interactive playback with a visual waveform representation.
• Paper Messages: Introduced a tool for generating and scanning paper-based messages with built-in QR code generation for easy sharing.
• LXMF Telemetry & Live Tracking:
• Full implementation of Sideband-compatible (Still need to test Columba) telemetry (FIELDTELEMETRY & FIELDTELEMETRY_STREAM).
• Live tracking with real-time map updates, distinct blue pulsing animations, and historical path tracing (breadcrumb trails).
• Mini-chat integrated into map markers for quick communication with telemetry peers.
• Privacy controls with global telemetry toggle and per-peer "Trust for Telemetry" settings.
• Detailed telemetry history timeline with interactive battery voltage/percentage sparkline charts.
• Documentation: You can now read all the project guides and help docs directly inside the app.
• Reliability:
• If the app ever crashes, it's now much better at picking up right where it left off without losing your data.
• Added Identity Switch Recovery: mechanism to restore previous identities or create emergency failsafes if a switch fails.
• Multi-Identity "Keep-Alive": Identities can now be kept active in the background when switching, ensuring you still receive messages and calls across all your personas.
• Added Database Snapshotting & Auto-Backups: You can now create named snapshots of your database and the app will perform automatic backups every 12 hours.
• Added Emergency Comms Mode: A lightweight mode that bypasses database storage and non-essential managers, useful for recovering from corrupted data or running in restricted environments. Can be engaged via UI, CLI flag (T383838--emergency), or environment variable (T383838MESHCHAT_EMERGENCY=1).
• Added Snapshot Restoration: Ability to restore from a specific snapshot on startup via T383838--restore-from-snapshot or T383838MESHCHAT_RESTORE_SNAPSHOT environment variable.
• Diagnostics:
• New Debug Logs Screen: View and export internal system logs directly from the UI for easier troubleshooting.
• Community: Better support for community-run network interfaces and checking TCP ping status of suggested interfaces.
• UI Tweaks: Added a new confirmation box for important actions and a better sidebar for browsing your archived messages.
• Micron Editor: Added multi-tab support with IndexedDB persistence, tab renaming, and a full editor reset button.
• Desktop Enhancements (Electron):
• Multi-Window Calls: Optional support for popping active calls into a focused 2nd window.
• System Tray Integration: The app now minimizes to the system tray, keeping you connected to the mesh in the background.
• Native Notifications: Switched to system-native notifications with deep-linking (click to focus conversation).
• Protocol Handling: Register as default handler for T383838lxmf:// and T383838rns:// links for seamless cross-app navigation.
• Hardware Acceleration Toggle: Power-user setting to disable GPU acceleration if flickering or glitches occur.
• Power Management: Automatically prevents system sleep during active audio calls to maintain RNS path stability.
• Added Web Audio Bridge which allows web/electron to hook into LXST backend for passing microphone and audio streams to active telephone calls.
• Added LXMFy for running bots.
• Added RNS Discoverable Interfaces https://markqvist.github.io/Reticulum/manual/interfaces.html#discoverable-interfaces and ability to map them (ones with a location).
Improvements
• Blazingly Fast Performance:
• Network Rendering: The Network Visualizer now uses intelligent batching to handle hundreds of nodes without freezing your screen.
• Memory Optimization: Added a smart icon cache that automatically clears itself to keep the app's memory footprint low.
• Parallel Loading: The app now fetches network data in parallel, cutting down startup and refresh times significantly.
• Lazy Loading: Documentation and other heavy components now load only when you need them, making the initial app launch much faster.
• Smoother Settings: Changing settings now uses "smart saving" (debouncing) to prevent unnecessary disk work and keep the interface responsive.
• Backend Efficiency: A massive core refactor and new database optimizations make message handling and search nearly instantaneous. Added pagination to announce and discovery lists to improve performance in large networks.
• Calling: The call screen and overlays have been completely redesigned to look better and work more smoothly.
• Messaging:
• Polished the message lists and archive views to make them easier to navigate.
• Added "Retry All" functionality for failed or cancelled messages in conversation views.
• Improved handling of T383838lxm.ingest_uri.result with detailed notifications for success/error/warning states.
• Maintenance Tools: Added new maintenance utilities to clear LXMF user icon caches and manage backup configurations.
• Network View: The visualizer that shows your network connections is now much clearer and easier to understand.
• Languages: Updated translations for English, German, and Russian. Added Italian (it-IT) localization. Added a toggle to easily enable or disable translation services.
• Search: The command palette (quick search) and notification bell are now more useful.
• CartoDB Tiles - some more styles if OSM is not enough for you, MBtiles will export tiles from the selected one.
• Basic Markdown in Messages - Support for basic markdown in messages
Bug Fixes
• Fixed issues where switching between different identities could sometimes cause glitches.
• Fixed several small bugs that could cause messages to get stuck or out of order.
• Lots of small UI fixes to make buttons and menus look right on different screens.
• Fixed glitchy message page
Technical
• Backend Architecture:
• Decoupled logic into new specialized managers: T383838community_interfaces.py, T383838docs_manager.py, T383838identity_manager.py, T383838voicemail_manager.py, and T383838nomadnet_utils.py.
• Added specialized utility modules: T383838meshchat_utils.py, T383838lxmf_utils.py, T383838async_utils.py, and T383838identity_context.py.
• Implemented a robust state-based crash recovery system in T383838src/backend/recovery/.
• Self-Healing Database Schema: Enhanced T383838DatabaseSchema with automatic column synchronization to prevent crashes when upgrading from older versions with missing columns.
• Enhanced database layer with T383838map_drawings.py and improved T383838telephone.py schema for call logging.
• Standardized markdown processing with a new T383838markdown_renderer.py.
• Added pagination support for announce queries in T383838AnnounceManager.
• Performance Engineering & Memory Profiling:
• Integrated a comprehensive backend benchmarking suite (T383838tests/backend/run_comprehensive_benchmarks.py) with high-precision timing and memory delta tracking.
• Added an EXTREME Stress Mode to simulate ultra-high load scenarios (100,000+ messages and 50,000+ announces).
• Implemented automated memory leak detection and profiling tests using T383838psutil and custom T383838MemoryTracker utilities.
• Full-Stack Integrity & Anti-Tampering:
• Implemented Backend Binary Verification: The app now generates a SHA-256 manifest of the unpacked Python backend during build and verifies it on every startup in Electron.
• Added Data-at-Rest Integrity Monitoring: The backend now snapshots the state of identities and database files on clean shutdown and warns if they were modified while the app was closed.
• New Security Integrity Modal: Notifies the user via a persistent modal if any tampering is detected, with a version-specific "do not show again" option.
• Frontend Refactor:
• Migrated complex call logic into T383838CallOverlay.vue and T383838CallPage.vue with improved state management.
• Implemented modular UI components: T383838ArchiveSidebar.vue, T383838RingtoneEditor.vue, T383838ConfirmDialog.vue, and T383838AudioWaveformPlayer.vue.
• Integrated a new documentation browsing system in T383838src/frontend/components/docs/.
• Added custom Leaflet integration for map drawing persistence in T383838MapPage.vue.
• Infrastructure:
• Added T383838Dockerfile.build for multi-stage container builds.
• Introduced T383838gen_checksums.sh for release artifact integrity.
• Comprehensive Testing Suite:
• Added 80+ new unit, integration, and fuzz tests across T383838tests/backend/ and T383838tests/frontend/.
• Implemented property-based fuzzing for LXMF message parsing and telemetry packing using T383838hypothesis.
• Updated CI coverage for telemetry and network interface logic.
• Updated core dependencies: T383838rns, T383838lxmf, T383838aiohttp, and T383838websockets.
• Developer Tools & CI:
• New T383838task commands: T383838bench-backend (Standard suite), T383838bench-extreme (Breaking Time and Space), T383838profile-memory (Leak testing), and T383838bench (Full run).
• Added Gitea Actions workflow (T383838bench.yml) for automated performance regression tracking on every push.
• Utilize Electron 39 features:
• Enabled ASAR Integrity Validation (Stable in E39) to protect the application against tampering.
• Hardened security by disabling T383838runAsNode and T383838nodeOptions environment variables via Electron Fuses.
• Implemented 3-Layer CSP Hardening: Multi-layered Content Security Policy protection across the entire application stack:
1. Backend Server CSP (T383838meshchatx/meshchat.py): Applied via T383838security_middleware to all HTTP responses, allowing localhost connections, websockets, and required external resources (OpenStreetMap tiles, etc.).
2. Electron Session CSP (T383838electron/main.js): Shell-level fallback CSP applied via T383838webRequest.onHeadersReceived handler to ensure coverage before the backend starts and for all Electron-rendered content.
3. Loading Screen CSP (T383838electron/loading.html): Bootloader CSP defined in HTML meta tag to protect the initial loading screen while waiting for the backend API to come online.
• Added hardware acceleration monitoring to ensure the Network Visualiser and UI are performing optimally.
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────